poj1961 kmp 重复串

来源:互联网 发布:文笔好的网络作家 编辑:程序博客网 时间:2024/05/19 20:43

题目:一个字符串,对它的所有前缀S1,判断S1是否是由若干S1的子串重复组合而成的,若是,则输出S1长度,重复次数

思路:同此题,http://blog.csdn.net/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;}

原创粉丝点击