HDU1711_Number Sequence__kmp

水题

 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 }

 

你可能感兴趣的:(sequence)