poj 2406 Power Strings

https://vjudge.net/problem/POJ-2406

题意:

求一个字符串的最小循环节的循环次数。

思路:

参考了白书的213页的例题,如何求循环节的长度,用kmp算法所得到的失配函数进行求解。循环节的长度是i - f[i]。因此这题直接用len / (len-f[len]) 求解循环节的个数,wa了一次,是因为len % (len-f[len]) 必须得等于0才行,循环节的长度肯定是能够整除长度才行,比如ababa这个例子。

代码:

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string>
 4 #include <string.h>
 5 using namespace std;
 6 
 7 string text;
 8 char a[1000005];
 9 int fl[1000005];
10 
11 void getfail(string p,int* f)
12 {
13     int m = p.size();
14 
15     f[0] = f[1] = 0;
16 
17     for (int i = 1;i < m;i++)
18     {
19         int j = f[i];
20 
21         while (j && p[i] != p[j]) j = f[j];
22 
23         f[i+1] = p[i] == p[j] ? j+1 : 0;
24     }
25 }
26 
27 int main()
28 {
29     while (scanf("%s",a) != EOF)
30     {
31         memset(fl,0,sizeof(fl));
32 
33         if (a[0] == '.') break;
34 
35         text = string(a);
36 
37         getfail(a,fl);
38 
39         int len = text.size();
40 
41         if (len % (len - fl[len]) == 0)
42         {
43             int ans = len / (len - fl[len]);
44 
45             printf("%d\n",ans);
46         }
47         else
48             printf("1\n");
49 
50 
51     }
52 
53     return 0;
54 }

 

posted @ 2017-07-28 23:20  qrfkickit  阅读(119)  评论(0编辑  收藏  举报