码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2406 Power Strings【KMP】

时间:2015-04-21 11:15:20      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2406


题目大意:

给定两个字符串a和b,定义a*b为两个字符串的链接。比如,a = "abc",b = "def",则

a*b ="abcdef"。这个定义当作是多项式。则一个字符串的非负整数次幂可定义如下:

a^0 = "",a^(n+1) = a*a^n。

现在给你一个字符串s,求出最大的n,满足s = a^n(a为s的某个子串)。比如s = "aaaa",

则n最大为4,a = "a",s = "a"^4。


思路:

对于给定的字符串s,最短的重复子串a是s[Next[len]] s[Next[len+1]] … s[len-1]。当

len % Next[len] = 0时,说明字符串s有不是它本身重复子串a,最大的n为len/Next[len]。

当len % Next[len] != 0时,除了s,没有重复子串a满足要求,这时n = 1。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

char str[1000010];
int Next[1000010],len;

void GetNext()
{
    int i = 0,j = -1;
    Next[0] = -1;
    while(i <= len)
    {
        if(j == -1 ||  str[i]==str[j])
        {
            i++,j++;
            Next[i] = j;
        }
        else
            j = Next[j];
    }
}
int main()
{
    while(cin >> str && strcmp(str,".")!=0)
    {
        len = strlen(str);
        GetNext();
        if(len % (len-Next[len]) == 0)
            cout << len/(len-Next[len]) << endl;
        else
            cout << 1 << endl;
    }

    return 0;
}


POJ2406 Power Strings【KMP】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45166821

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