给一个字符串。求这个串的最小的循环节的长度。

好像。num = len/(len-next[len]) 就是循环节的长度。如果 len%(len-next[len]) ==0 就是 说字符串长度刚好是循环节长度的整数倍。不然的话。说明没有最小循环节。

证明嘛。这里好像还是蛮靠谱的。http://blog.csdn.net/euler_m/article/details/6281903

但是。。还是没有看懂。。~~~~(>_<)~~~~暂且记住吧,,

附代码;

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 #define maxn 1000010
 7 
 8 int next[maxn];
 9 char str[maxn];
10 int ans[maxn];
11 
12 void getNext(char str[]) {
13      int len=strlen(str+1);
14      next[1] = 0;
15      for (int k=0, q=2; q<=len; ++q) {
16         while(k>0 && str[k+1] != str[q])
17         k=next[k];
18         if (str[k+1] == str[q])
19             k++;
20         next[q] = k;
21      }
22 }
23 
24 int main()
25 {
26     while(scanf("%s",str+1)!= EOF)
27     {
28         if (str[1] == '.') break;
29         int len = strlen(str+1);
30         getNext(str);
31         int flag = len % (len - next[len]);
32         if (flag != 0) printf("1\n");
33         else {
34             int num = len / (len - next[len]);
35             printf("%d\n", num);
36         }
37     }
38     return 0;
39 }
View Code

 

posted on 2015-10-06 15:42  小小八  阅读(195)  评论(0编辑  收藏  举报