题意:KMP
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1000005];
int b[10005];
int next[10005];
void getnext(int m)
{
next[0]=0;
next[1]=0;
for(int i=1;i<m;++i)
{
int j=next[i];
while(j&&b[i]!=b[j])j=next[j];
next[i+1]= (b[i]==b[j]?j+1:0);
}
}
int main()
{
//freopen("data.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
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]);
}
getnext(m);
bool f=0;
for(int i=0,j=0;i<n;++i)
{
if(a[i]==b[j]&&j<m)
{
j++;
}
else
{
while(j>0)
{
j=next[j];
if(a[i]==b[j])
{
j++;
break;
}
}
}
if(j==m)
{
f=1;
printf("%d\n",i-m+2);break;
}
}
if(!f)printf("-1\n");
}
return 0;
}