标签:
题目描述:
给定一个字符串,求其最大循环次数(即求最小循环节长度)
输入样例
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