这是一道基础的kmp的题目。做法就不细说了。
对于kmp的知识,有篇博客介绍得非常全面——从头到尾彻底理解KMP(2014年8月4日版)
#include<stdio.h>
int n,m,next[10000],s[1000000],p[10000];
void getnext()
{
int k=0,j=1;
next[0]=-1;next[1]=0;
while (j<m-1)
{
if (k==-1||p[j]==p[k])
{
k++;
j++;
next[j]=k;
}
else k=next[k];
}
}
int kmp()
{
int i=0;
int j=0;
while (i<n&&j<m)
{
if (s[i]!=p[j]) while (s[i]!=p[j]) i++;
else
{
while (j!=-1&&j<m)
{
if (s[i]==p[j])
{
i++;
j++;
if (j==m) break;
}
else j=next[j];
}
if (j==-1) j++;
}
}
if (j==m)
return i-j+1;
else
return -1;
}
int main()
{
int t,i;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (i=0;i<n;i++) scanf("%d",&s[i]);
for (i=0;i<m;i++) scanf("%d",&p[i]);
getnext();
printf("%d
",kmp());
}
}