POJ2406 Power Strings

来源:互联网 发布:网络的利与弊议论文400 编辑:程序博客网 时间:2024/06/06 17:13

一. 原题链接:http://poj.org/problem?id=2406

二. 题目大意:给一个字符串,求出它由几个最小周期组成。比如说aaaa,由4个a组成。ababab,3个ab组成。

三. 解题思路:KMP Next数组中保存的是从0开始每一位的最大前后缀,意味着,下标从0开始,len-Next[len-1] 到len-1 与 0到Next[len-1]是一样的。而且len-Next[len-1] 到len-1 肯定是最小前后缀,如果总长度len是它的倍数,那么它就是最小周期。

四. 代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int MAX_N = 1010000,          INF = 0x3f3f3f3f;int Next[MAX_N];char pattern[MAX_N];void getNext(){    int i, k;    Next[0] = 0;    for(i = 1; pattern[i]; i++){        k = Next[i-1];        while(pattern[i] != pattern[k] && k>0)            k = Next[k-1];        if(pattern[i] == pattern[k])            Next[i] = k+1;        else            Next[i] = 0;    }}int main(){    //freopen("in.txt", "r", stdin);    while(~scanf("%s", pattern) && pattern[0] != '.'){        getNext();        int res = 1, len = strlen(pattern);        if(len % (len - Next[len-1]) == 0)            res = len/(len-Next[len-1]);        printf("%d\n", res);    }    return 0;}


0 0
原创粉丝点击