基础KMP题
#include<cstdio>
using namespace std;
const int maxn=10000+100;
int ch[maxn*100],ph[maxn];
int fail[maxn];
int n,m;
inline void getFail(){
fail[0]=fail[1]=0;
for(int i=1;i<m;i++){
int j=fail[i];
while(j && ph[i]!=ph[j]) j=fail[j];
fail[i+1]= (ph[i]==ph[j]?j+1:0);
}
}
inline int match(){
int j=0;
for(int i=0;i<n;i++){
while(j && ch[i]!=ph[j]) j=fail[j];
if(ch[i]==ph[j]) j++;
if(j==m) return i-m+2;
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&ch[i]);
for(int i=0;i<m;i++) scanf("%d",&ph[i]);
getFail();
printf("%d\n",match());
}
}