#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[1000010],b[10010];
int next[10010];
void get_next()
{
int i=1,j=0;
next[1]=0;
while(i<b[0])
{
if(b[i]==b[j]||j==0)
{
i++;
j++;
if(b[i]!=b[j])
{
next[i]=j;
}
else
{
next[i]=next[j];
}
}
else
{
j=next[j];
}
}
}
int index_kmp()
{
int i,j;
i=j=1;
while(i<=a[0]&&j<=b[0])
{
if(a[i]==b[j]||j==0)
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>b[0])
{
return i-b[0];
}
else
{
return -1;
}
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(next,0,sizeof(next));
scanf("%d%d",&n,&m);
a[0]=n;
b[0]=m;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
}
get_next();
int p=index_kmp();
printf("%d\n",p);
}
system("pause");
return 0;
}
转载于:https://www.cnblogs.com/zhangshu/archive/2011/07/30/2122169.html