#include <stdio.h>
#include <string.h>
int N,M;
int a[1000005],b[10005],next[10005];
void getnext()
{
int k=1,j=0;
while(k<M)
{
if(j==0||b[j]==b[k])
{
++j;++k;
if(b[j]==b[k])
next[k]=next[j];
else
next[k]=j;
}
else
j=next[j];
}
}
int kmp()
{
int i=0,j=0;
while(i<=N&&j<=M)
{
if(a[i]==b[j]||j==0)
{++i;++j;}
else
j=next[j];
}
if(j>M)
return i-M;
else
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
for(int i=1;i<=M;i++)
scanf("%d",&b[i]);
getnext();
printf("%d\n",kmp());;
}
}
hdu 1711(KMP)
最新推荐文章于 2022-08-16 16:03:58 发布