【无聊放个模板系列】HDU 1358 KMP

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 1000010
10 
11 char s[Maxn];
12 int a[Maxn],nt[Maxn];
13 int l;
14 
15 void kmp()
16 {
17     int p=0;
18     for(int i=2;i<=l;i++)
19     {
20         while(s[i]!=s[p+1]&&p) p=nt[p];
21         if(s[i]==s[p+1]) p++;
22         nt[i]=p;
23     }
24 }
25 
26 int main()
27 {
28     int kase=0;
29     while(1)
30     {
31         scanf("%d",&l);
32         if(l==0) break;
33         scanf("%s",s+1);
34         kmp();
35         printf("Test case #%d
",++kase);
36         // for(int i=2;i<=l;i++) printf("%d ",nt[i]);printf("
");
37         for(int i=2;i<=l;i++)
38         {
39             if(nt[i]!=0&&i%(i-nt[i])==0) printf("%d %d
",i,i/(i-nt[i]));
40         }printf("
");
41     }
42     return 0;
43 }

KMP

2016-11-17 20:12:31

原文地址:https://www.cnblogs.com/Konjakmoyu/p/6075284.html