Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 32075 | Accepted: 13373 |
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
Waterloo local 2002.07.01
题目链接 :http://poj.org/problem?id=2406
题目大意 :给一个字符串求其周期子串的个数
题目分析 :用KMP算法中的next数组找周期串
题目链接 :http://poj.org/problem?id=2406
题目大意 :给一个字符串求其周期子串的个数
题目分析 :用KMP算法中的next数组找周期串
#include <cstdio>
#include <cstring>
int const MAX = 1000000 + 5;
char str[MAX];
int next[MAX];
int cal()
{
int ans = 1;
next[0] = -1;
int k = -1, j = 0;
while(str[j] != '\0')
{
if(k == -1 || str[k] == str[j])
{
k++;
j++;
next[j] = k;
}
else
k = next[k];
}
//这题和Period那题的区别就在这,这题要求原字符串的某一周期子串乘其周期等于原串长
if(j % (j - next[j]) == 0)
ans = j / (j - next[j]);
return ans;
}
int main()
{
while(scanf("%s",str) != EOF && !(strlen(str) == 1 && str[0] == '.'))
{
memset(next,0,sizeof(next));
printf("%d\n",cal());
}
}