标签:
题目描述:
给定一个字符串,求其最大循环次数(即求最小循环节长度)
输入样例
abcd
ababab
aaaa
.
输出样例
1
3
4
解题思路:
KMP算法中next数组的应用。
len-next[len]表示的是字符串相同前缀空出来的一段,由next数组性质可知,这一段可以不断向前推出相等,所以只要判断len是否可以整除len-next[len]就可以了。否则就是1.
代码如下
#include <cstdio> #include <cstring> const int maxn = 1000010; int next[maxn]; char s[maxn]; void GetNext(char* p,int next[]) { int pLen = strlen(p); int k = -1;//k记录的是next[j] next[0] = k; int j = 0; while (j < pLen) { /** next[j]=-1时,next[j+1]肯定是0;p[j]=p[k]时,next[j+1]=next[j]+1 */ if (k == -1 || p[j] == p[k]) { ++k; ++j; /*if(p[j] != p[k])*/ next[j] = k; // else next[j] = next[k]; } else k = next[k]; } } int main() { while(scanf("%s",s) && s[0] != '.') { int len = strlen(s); GetNext(s,next); int cc = 1; if(len%(len-next[len]) ==0) cc=len/(len-next[len]); printf("%d\n",cc); } return 0; }
POJ2406 Power Strings next数组应用
标签:
原文地址:http://blog.csdn.net/area_52/article/details/43304609