题目连接:点我
Input
The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on it.Output
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.Sample Input
3 aaa 12 aabaabaabaab 0Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4题意:
给定一个字符串,问这个字符串的所有前缀中,有哪些前缀可以由某个串重复k次组成, 并且这个k最大是多少。这个k需要大于1。
思路:
KMP算法,对于每次匹配成功,我们都判断是否
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 1e6+10; char s[maxn]; int nextt[maxn]; void getnextt(int len){ std::ios::sync_with_stdio(false); int i = 0, j = -1; nextt[0] = -1; while(i<len){ if(j == -1 || s[i] == s[j]){ i++; j++; nextt[i] = j; if(i % (i - j) == 0 && i/(i-j )> 1)// i - j 为循环节长度, cout<<i<<' '<<i/(i-j)<<endl; }else j = nextt[j]; } } int main(){ int n; std::ios::sync_with_stdio(false);//解除输入限制,可以提高 cin 的速度 int kase = 0; while(cin>>n && n){ cin>>s; memset(nextt, 0, sizeof(nextt)); cout<<"Test case #"<<++kase<<endl; getnextt(n); cout<<endl; }return 0; }