题目:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题意:
意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)
的两次组成,也就是aa有两个a组成;
第三行自然就是aabaab可有两个aab组成;
第四行aabaabaab可由三个aab组成;
第五行aabaabaabaab可有四个aab组成
题意: 一个字符串,从头到某个位置,字符串的前缀最多重复了多少次
思路:kmp计算前缀的算法。
观察发现,在周期字符串中某个周期的字符串长度为 i-fail[i] 若满足周期i%(i-fail[i])==0并且fail[i]!=0;
代码:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
const int maxn=1000010;
int fail[maxn];
void getFail(string zi)
{
fail[0]=0,fail[1]=0;
for(int i=1;i<zi.size();i++){
int j=fail[i];
while(j&&zi[i]!=zi[j])
j=fail[j];
fail[i+1]=zi[i]==zi[j]?j+1:0;
}
}
int main()
{
int x;
int k=1;
while(scanf("%d",&x),x){
string zi;
cin>>zi;
getFail(zi);
int maxn=0;
printf("Test case #%d\n",k++);
for(int i=0;i<=zi.size();i++){
if(fail[i]!=0&&i%(i-fail[i])==0){//i-fail[i]为剩下串的长度
printf("%d %d\n",i,i/(i-fail[i]));
maxn=fail[i];
}
}
cout<<endl;
}
return 0;
}