这个明显的是KMP算法的题目...
嘿嘿..大家给看看代码吧,看看有什么需要改进的没有,
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 0x3fffffff// inf represents the end of KMP;
int str[1000005],pat[10005];
int next[10005];
int N,M;
void Next()
{
int temp;
memset(next,0,sizeof(next));
for(int i=1;i<M;i++)
{
temp=next[i-1];
while(temp&&pat[temp]!=pat[i])
temp=next[temp-1];
if(pat[temp]==pat[i])
next[i]=temp+1;
else
next[i]=0;
}
}
int KMP()
{
int i=0;
int j=0;
while(str[i]!=inf&&pat[j]!=inf)
{
if(str[i]==pat[j])
i++,j++;
else if(j==0)
i++;
else
j=next[j-1];
}
if(j==M)
return i-j+1;
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
scanf("%d",&str[i]);
str[i]=inf;
for(i=0;i<M;i++)
scanf("%d",&pat[i]);
pat[i]=inf;
Next();
int ans=KMP();
printf("%d\n",ans);
}
return 0;
}