hdu 1711Number Sequence
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
数字KMP,原来还能这么用
1 #include<stdio.h> 2 int a[1000010],b[10010]; 3 int next[10010]; 4 int n,m; 5 void getNext() 6 { 7 int j,k; 8 j=0; 9 k=-1; 10 next[0]=-1; 11 while(j<m) 12 { 13 if(k==-1||b[j]==b[k]) 14 next[++j]=++k; 15 else k=next[k]; 16 } 17 } 18 //返回首次出现的位置 19 int KMP_Index() 20 { 21 int i=0,j=0; 22 getNext(); 23 24 while(i<n && j<m) 25 { 26 if(j==-1||a[i]==b[j]) 27 { 28 i++; 29 j++; 30 } 31 else j=next[j]; 32 33 } 34 if(j==m) return i-m+1; 35 else return -1; 36 } 37 int main() 38 { 39 int T; 40 scanf("%d",&T); 41 while(T--) 42 { 43 scanf("%d%d",&n,&m); 44 for(int i=0;i<n;i++) 45 scanf("%d",&a[i]); 46 for(int i=0;i<m;i++) 47 scanf("%d",&b[i]); 48 printf("%d\n",KMP_Index()); 49 } 50 return 0; 51 }