http://acm.hdu.edu.cn/showproblem.php?pid=1711
KMP的简单应用啊
直接贴代码了
代码:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<stdio.h> 4 using namespace std; 5 #define maxn 1000010 6 int n,m; 7 int a[maxn],b[maxn]; 8 int f[maxn]; 9 void callfail() 10 { 11 int i,j=0,k=-1; 12 f[0]=-1; 13 while(j<m) 14 { 15 if(k==-1||b[j]==b[k]) 16 { 17 k++;j++; 18 f[j]=k; 19 } 20 else k=f[k]; 21 } 22 } 23 int Answer() 24 { 25 int i=0,j=0; 26 while(i<n&&j<m) 27 { 28 if(j==-1||a[i]==b[j])//j==-1 is important .Remember it!!! 29 { 30 i++;j++; 31 if(j==m) return i-m+1; 32 33 } 34 else j=f[j]; 35 } 36 return -1; 37 } 38 int main() 39 { 40 int t; 41 scanf("%d",&t); 42 while(t--) 43 { 44 scanf("%d%d",&n,&m); 45 for(int i=0;i<n;i++) 46 scanf("%d",&a[i]); 47 for(int i=0;i<m;i++) 48 scanf("%d",&b[i]); 49 callfail(); 50 cout<<Answer()<<endl; 51 } 52 return 0; 53 54 }