标签:
水题
1 #include<cstdio> 2 #include<cstring> 3 const int maxn=1e6+5; 4 const int maxm=1e4+5; 5 int p[maxm]; 6 int t[maxn]; 7 int f[maxm]; 8 int n,m; 9 void getfail() 10 { 11 f[0]=f[1]=0; 12 for(int i=1;i<m;i++){ 13 int j=f[i]; 14 while(j&&p[j]!=p[i]) 15 j=f[j]; 16 f[i+1]=p[i]==p[j]?j+1:0; 17 } 18 } 19 void kmp() 20 { 21 getfail(); 22 int j=0; 23 for(int i=0;i<n;i++){ 24 while(j&&p[j]!=t[i]) 25 j=f[j]; 26 if(p[j]==t[i]) 27 j++; 28 if(j==m){ 29 printf("%d\n",i-m+2); 30 return ; 31 } 32 } 33 printf("-1\n"); 34 return ; 35 } 36 int main() 37 { 38 int test; 39 scanf("%d",&test); 40 while(test--){ 41 scanf("%d%d",&n,&m); 42 for(int i=0;i<n;i++) 43 scanf("%d",&t[i]); 44 for(int i=0;i<m;i++) 45 scanf("%d",&p[i]); 46 kmp(); 47 } 48 return 0; 49 }
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4307224.html