kmp模板,不理解就自己百度学习吧。
s t数组中第一位存储的都是其长度 ,注意i,j初始化的值
//kmp模板题
//使用优化过后的kmp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f
const int maxn=10000+10;
int s[1000010],t[maxn];
int* get_gnext()
{
int i,j;
int* next=(int*)malloc(maxn*sizeof(int));
next[1]=0,i=1,j=0;
while(i<=t[0]){
if(0==j || t[i]==t[j]){
i++,j++;
if(t[i]!=t[j]) next[i]=j;
else next[i]=next[j];
}else
j=next[j];
}
return next;
}
int kmp()
{
int *next=get_gnext();
int i=1,j=1;
while(i<=s[0]&&j<=t[0]){
if(0==j || s[i]==t[j]) i++,j++;
else j=next[j];
}
if(j>t[0]) return i-t[0];
else return -1;
}
int main()
{
int T;
cin >> T;
while(T--){
int n,m,i,j;
cin >> n >> m;
s[0]=n,t[0]=m;
for(i=1;i<=s[0];i++)
scanf("%d",&s[i]);
for(i=1;i<=t[0];i++)
scanf("%d",&t[i]);
cout << kmp() << endl;
}
return 0;
}