纯模板,查找a串中首次出现b串的位置
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 1000001
using namespace std;
int a[M],b[10001],f[10001];
int n,m;
void getFail(int *p)
{
f[0]=f[1]=0;
int j=0;
for(int i=1;i<m;++i){
j=f[i];
while(j&&p[i]!=p[j]) j=f[j];
f[i+1]=p[i]==p[j] ? j+1 : 0 ;
}
}
int KMP(int *p,int *t)
{
getFail(t);
int j=0;
for(int i=0;i<n;++i){
while(j&&p[i]!=t[j]) j=f[j];
if(p[i]==t[j]) j++;
if(j==m) return i-m+2;
}
return -1;
}
int main()
{
int T;
cin>>T;
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<n;++i) scanf("%d",&a[i]);
for(int i=0;i<m;++i) scanf("%d",&b[i]);
printf("%d\n",KMP(a,b));
}
return 0;
}