将数字看作字符,用KMP算法寻找子串;
#include<iostream>
using namespace std;
#define MA 1000001
#define MB 10001
int n,m;
int index;
int a[MA];
int b[MB];
int next[MB];
void my_overlay()
{
int i;
next[0]=-1;
for(i=1;i<m;i++)
{
index=next[i-1];
while(index>=0&&b[i]!=b[index+1])
index=next[index];
if(b[i]==b[index+1]) next[i]=index+1;
else next[i]=-1;
}
}
void my_kmp()
{
int i,j=0;
for(i=0;i<n;)
{
if(a[i]==b[j])
{
i++;j++;
}
else {
if(j==0) i++;
else j=next[j-1]+1;
}
if(j==m) break;
}
if(j==m) cout<<i-m+1<<endl;
else cout<<-1<<endl;
}
int main()
{
int t,i,j,k;
cin>>t;
for(i=0;i<t;i++)
{
cin>>n>>m;
for(j=0;j<n;j++)
cin>>a[j];
for(k=0;k<m;k++)
cin>>b[k];
my_overlay();
my_kmp();
}
return 0;
}