题意:基本是裸的KMP了 不解释了,但是有个地方需要注意下,如果不改就一直WA
#include<iostream>
using namespace std;
int next[10010];
int T[10010];
int S[1000010];
int m,n;
void get_next()
{
int j=0,k=-1;
next[0]=-1;
while(j<m)
{
if(k==-1||T[k]==T[j])
{
next[j+1]=k+1;
j++;k++;
}
else
k=next[k];
}
}
int kmp()
{
int i=0,j=0;
while(i<n&&j<m)//注意
{
//if(j==m) return (i-j+1); 放在这里就WA 不知道怎么回事
if(S[i]==T[j]||j==-1)
{
i++;j++;
}
else
j=next[j];
}
if(j==m) return (i-j+1);//注意
return -1;
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&S[i]);
for(int j=0;j<m;j++)
scanf("%d",&T[j]);
get_next();
int flag=kmp();
if(flag!=-1) printf("%d\n",flag);
else printf("-1\n");
}
}