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 }

 

posted @ 2016-07-21 13:29  pter  阅读(103)  评论(0编辑  收藏  举报