题目:一个字符串,对它的所有前缀S1,判断S1是否是由若干S1的子串重复组合而成的,若是,则输出S1长度,重复次数
思路:同此题,http://blog.youkuaiyun.com/my_gemini_acm/article/details/8247729。注意这里子串重复数必须大于1。
#include<iostream>
#include<string>
using namespace std;
const int maxn=1000001;
int fail[maxn];
void kmp(string a)
{
int j=-1;
memset(fail,-1,sizeof(fail));
for(int i=1;i<a.length();i++)
{
while(j>-1 && a[j+1]!=a[i]) j=fail[j];
if(a[j+1]==a[i]) j++;
fail[i]=j;
}
}
int main()
{
int N,P=0;
while(cin>>N && N!=0)
{
string a;
cin>>a;
P++;
cout<<"Test case #"<<P<<endl;
kmp(a);
for(int i=1;i<a.length();i++)
{
int sub=i-fail[i];
if((i+1)%sub==0 && (i+1)/sub>1) cout<<i+1<<' '<<(i+1)/sub<<endl;
}
cout<<endl;
}
return 0;
}