您的位置:首页 > 其它

POJ2406 Power Strings【KMP】

2015-04-21 10:21 267 查看
题目链接:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: