题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749
题目大意:给一个原序列N,再给出一个序列M,问从N中一共可以找出多少个长度为m的序列,序列中的数的相对大小关系与序列M中相对大小关系相同。(序列之间不能重叠)
解题思路:从头开始以i为起点暴搜,不断找长度为m的序列,判断是否满足条件。若满足,跳到i+m之后继续搜,若不满足,向后移一位继续搜。
判断方法压缩数据比较相对大小。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int N[],M[];
int n,m,k,all;
int to[],y[];
bool judge(int start)
{
memset(to,,sizeof(to));
memset(y,,sizeof(y));
int i,j,l,MM;
MM=;
for(i=start,j=;i<m+start;i++,j++)
{
if(to[N[i]]==&&y[M[j]]==)
{
to[N[i]]=M[j];
y[M[j]]=N[i];
if(MM<M[j])MM=M[j];
for(l=M[j]-;l>=;l--)
{
if(y[l]){
if(y[l]>N[i])
{
return false;
}
break;
}
}
for(l=M[j]+;l<=MM;l++)
{
if(y[l])
{
if(y[l]<N[i])
return false;
break;
}
}
}
else
{
if(!y[M[j]]||!to[N[i]])
return false;
if(N[i]!=y[M[j]]||M[j]!=to[N[i]])
return false;
}
}
return true;
}
int main()
{
int i;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
all=;
for(i=;i<n;i++)
scanf("%d",&N[i]);
for(i=;i<m;i++)
scanf("%d",&M[i]);
for(i=;i<=n-m;i++)
{
if(judge(i))
{
all++;
i+=m-;
}
}
printf("%d\n",all);
}
return ;
}