#include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; const int MAXSIZE = 1000000; int m; int n; int a[MAXSIZE]; int b[MAXSIZE];//我不太知道数组怎么在函数里传递 int next(int k) { int i=1; int j=2; int n=0; while(j<k) { if(b[i]==b[j]) { ++n; ++i; ++j; } else { ++j; i=1; n=0; } } if(k==1){//这个强制定义的也一定要加上,一定不能落条件 return 0; }else{ return n+1; } } int main() { // int next[6]= {-1,0,1,1,0,2};//next和nextal int fre; // int m; // int n; // char ge; scanf("%d",&fre); // scanf("%c",&ge); for(int i=0; i<fre; ++i) { scanf("%d %d",&m,&n); memset(a, 0, m); memset(b, 0, n); // int a[m+1]; // int b[n+1]; for(int j=1; j<=m; ++j) { scanf("%d",&a[j]); } for(int k=1; k<=n; ++k) { scanf("%d",&b[k]); } int j=1; int k=1; while(j<=m&&k<=n)//这个用while,不用for { if(a[j]==b[k])//相等就一次往后加 { ++j; ++k; } else//不相等,让k跳到数组哪里,j先不动 { k=next(k); // k=next[k]; if(k==0)//如果在模式串第一个字母就不对,那么两个都往后+1,这个时候,k=0,正好+1,变成了1 { ++j; ++k; } } } // for(int i=1;i<=n;++i){ // printf("%d ",next(b,i)); // } // printf("\n"); //成功出来之后,k=n+1,并且a[j-1]==b[k-1] if(k==n+1&&a[j-1]==b[k-1]) //你就要想好,匹配上的条件是什么! { printf("%d\n",j-n);//这种最难确定了,一会再改 } else { // printf("%d\n",j); // printf("%d\n",n); printf("-1\n"); } // for(int j=0;j<m;++j){ // for(int k=0;k<n;++k){ // } // } // for(int k=0;k<n;++k){ // printf("%d ",b[k]); // } } }