Kmp
1 #include<stdio.h> 2 #include<string.h> 3 #define N 1000005 4 int s[N]; 5 int p[N]; 6 int next[N]; 7 int m,n; 8 void getnext(){ 9 int j=0,k=-1; 10 next[0]=-1; 11 while(j<m){ 12 if(k==-1||p[j]==p[k]){ 13 j++; 14 k++; 15 next[j]=k; 16 } 17 else 18 k=next[k]; 19 } 20 } 21 int kmp(){ 22 int i=0,j=0; 23 getnext(); 24 while(i<n){ 25 if(j==-1||s[i]==p[j]){ 26 i++; 27 j++; 28 } 29 else 30 j=next[j]; 31 if(j==m) 32 return i; 33 } 34 return -1; 35 } 36 int main(){ 37 int t; 38 scanf("%d",&t); 39 while(t--){ 40 scanf("%d%d",&n,&m); 41 for(int i=0;i<n;i++) 42 scanf("%d",&s[i]); 43 for(int i=0;i<m;i++) 44 scanf("%d",&p[i]); 45 if(kmp()==-1) 46 printf("-1\n"); 47 else 48 printf("%d\n",kmp()-m+1); 49 } 50 return 0; 51 }