#include <iostream> #include <cstdio> //#include <string> #include <vector> using namespace std; vector<int> a; vector<int> b; int next(int *b,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; } } return n; // for(int i=1;i<k;++i){ // for(int j=2;j<k;++i){ // } // } } 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); // 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(b,k); if(k==0)//如果在模式串第一个字母就不对,那么两个都往后+1,这个时候,k=0,正好+1,变成了1 { ++j; ++k; } } } //成功出来之后,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"); } // 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]); // } } }