题目 点击前往题目
AC Code
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=1e6+50;
int n,m;
int a[maxn];
int b[maxn];
int nextt[maxn];
void init()
{
int i=0,j=-1;
nextt[0]=-1;
while(i<m)
{
if(j==-1||b[i]==b[j])
{
i++;
j++;
nextt[i]=j;
}
else
{
j=nextt[j];
}
}
}
void kmp(){
init();
int i=0,k=0,ans = -1;
while(i<n){
if(k==-1||b[k]==a[i]){
i++;
k++;
}else{
k=nextt[k];
}
if(k==m){
ans = i-m+1;
printf("%d\n",ans);
break;
}
}
if(ans==-1)cout<<"-1"<<endl;
}
int main()
{
int ttt;
scanf("%d",&ttt);
while(ttt--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int j=0;j<m;j++)
scanf("%d",&b[j]);
kmp();
}
return 0;
}