UVa 1328 (KMP求字符串周期) Period

当初学KMP的时候也做过这道题,现在看来还是刘汝佳的代码要精简一些,毕竟代码越短越好记,越不容易出错。

而且KMP的递推失配函数的代码风格和后面的Aho-Corasick自动机求失配函数的代码风格也是一致的。

 1 #include <cstdio>
 2 
 3 const int maxn = 1000000 + 10;
 4 char s[maxn];
 5 int f[maxn]; //失配函数
 6 
 7 int main()
 8 {
 9     //freopen("in.txt", "r", stdin);
10 
11     int n, kase = 0;
12     while(scanf("%d", &n) == 1 && n)
13     {
14         getchar();
15         for(int i = 0; i < n; i++) s[i] = getchar();
16 
17         //递推求解失配函数
18         f[0] = f[1] = 0;
19         for(int i = 1; i < n; i++)
20         {
21             int j = f[i];
22             while(j && s[i] != s[j]) j = f[j];
23             f[i+1] = s[i] == s[j] ? j+1 : 0;
24         }
25 
26         printf("Test case #%d
", ++kase);
27         for(int i = 2; i <= n; i++)
28             if(f[i] && i % (i - f[i]) == 0)
29                 printf("%d %d
", i, i / (i - f[i]));
30         printf("
");
31     }
32 
33     return 0;
34 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4390490.html