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\n", ++kase);

27         for(int i = 2; i <= n; i++)

28             if(f[i] && i % (i - f[i]) == 0)

29                 printf("%d %d\n", i, i / (i - f[i]));

30         printf("\n");

31     }

32 

33     return 0;

34 }
代码君

 

你可能感兴趣的:(字符串)