码迷,mamicode.com
首页 > 编程语言 > 详细

POJ2406 Power Strings next数组应用

时间:2015-01-30 16:11:23      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

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

输入样例

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!