首页 > 代码库 > POJ2406 Power Strings next数组应用

POJ2406 Power Strings next数组应用

题目描述:

给定一个字符串,求其最大循环次数(即求最小循环节长度)

输入样例

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数组应用