//hdu1711
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int NN=1000005;
//KMP套模板
//string A,B;
int A[NN];
int B[NN];
int lenA,lenB;
int prefix[NN];
void init()
{
memset(prefix,0,sizeof(prefix));
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
}
void getprefix()
{
prefix[0]=-1;
prefix[1]=0;//长度为1的字符串,设定prefix为0
int i=1,j;
int len=0;
while(i<lenB)
{
if(len==-1||B[i]==B[len])
{
len++;
i++;
prefix[i]=len;
}
else len=prefix[len];
}
// for(int i=0; i<B.length(); i++)
// printf("prefix[%d]:%d ",i,prefix[i]);
// cout<<endl;
}
void KMP()
{
getprefix();
int i=0,j=0;
bool cnt=0;
while(i<lenA)
{
if(j==-1||A[i]==B[j])
{
i++,j++;
if(j>=lenB)
{
cnt=1;
int k1=(i-lenB)+1;
cout<<k1<<endl;//只要输出最小的k就行了
break;
j=0;
}
}
else j=prefix[j];
}
if(!cnt)cout<<"-1"<<endl;
}
int main()
{
int T;
scanf("%d",&T);
for(int i=0; i<T; i++)
{
scanf("%d %d",&lenA,&lenB);
init();
for(int p=0; p<lenA; p++)
cin>>A[p];
for(int p=0; p<lenB; p++)
cin>>B[p];
KMP();
}
return 0;
}
hdu1711——KMP算法模版
最新推荐文章于 2021-04-06 14:09:40 发布