这是一道KMP入门题目!直接套模板!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn1=1000005;
const int maxn2=10005;
int next1[maxn2];
int s1[maxn1],s2[maxn2];
void getnext(int s2[],int lent)
{
int j=0,k=-1;
next1[0]=-1;
while(j<lent)
{
if(s2[j]==s2[k]||k==-1)
next1[++j]=++k;
else
k=next1[k];
}
}
int KMP(int lens,int lent)
{
int i=0,j=0;
while(i<lens)
{
if(j==lent)return i+1-lent;
if(s1[i]==s2[j]||j==-1)
++i,++j;
else
j=next1[j];
}
if(j==lent)return i+1-lent;
return -1;
}
int main()
{
int t,n,m;
int i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
scanf("%d",&s1[i]);
}
for(i=0; i<m; i++)
{
scanf("%d",&s2[i]);
}
getnext(s2,m);
int sum;
sum=KMP(n,m);
printf("%d\n",sum);
}
return 0;
}