1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int n,m; 7 int t[100010]; 8 int s[1000010]; 9 int next1[100010]; 10 11 void getnext() 12 { 13 next1[0]=-1; 14 int i=0,j=-1; 15 while(i<m) 16 { 17 while(j!=-1&&t[i]!=t[j]) 18 j=next1[j]; 19 next1[++i]=++j; 20 } 21 } 22 23 int kmp() 24 { 25 getnext(); 26 int i=0,j=0; 27 while(i<n) 28 { 29 while(j!=-1&&s[i]!=t[j]) 30 j=next1[j]; 31 i++; 32 j++; 33 if(j>=m) 34 { 35 return i-m+1; 36 } 37 } 38 return -1; 39 } 40 41 int main() 42 { 43 int T; 44 scanf("%d",&T); 45 while(T--) 46 { 47 scanf("%d%d",&n,&m); 48 for(int i=0;i<n;i++) 49 { 50 scanf("%d",&s[i]); 51 } 52 for(int i=0;i<m;i++) 53 { 54 scanf("%d",&t[i]); 55 } 56 cout<<kmp()<<endl; 57 } 58 return 0; 59 }
时间: 2024-10-07 05:29:42