模板题不解释
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<limits.h> #include<math.h> #include<algorithm> using namespace std; int n,m; int p[1000005],a[1000005],b[10005]; int ans; void print() { p[1]=0; int i,j=0; for(i=2;i<=m;i++) { while(j>0 && b[j+1]!=b[i]) j=p[j]; if(b[j+1]==b[i]) j++; p[i]=j; } } void kmp() { int i,j=0; for(i=1;i<=n;i++) { while(j>0 && b[j+1]!=a[i]) j=p[j]; if(a[i]==b[j+1]) j++; if(j==m) { ans=i; return ; } } } int main() { int T,i,j; scanf("%d",&T); while(T--) { ans=-1; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(j=1;j<=m;j++) scanf("%d",&b[j]); print(); kmp(); if(ans==-1) printf("-1\n"); else printf("%d\n",ans-m+1); } }