题目链接:
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; }
时间: 2024-09-29 22:40:13