http://acm.hdu.edu.cn/showproblem.php?pid=1358
题意:从字符串的第二个开始,找前面的循环串,输出循环结尾的位置,和循环串的周期,周期必须大于1
思路:字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的串为一个轮回串,其中轮回子串出现i/(i-next[i])次。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1000010;
int n;
int Next[maxn];
char str[maxn];
void GetNext(char *str, int *Next)
{
Next[0] = -1;
int i = 0, k = -1;
while(str[i])
{
if(k == -1 || str[i] == str[k]){
i++,k++;
Next[i] = k;
}
else{
k = Next[k];
}
}
}
int main()
{
int flag = 1;
while(cin>>n && n){
cin>>str;
GetNext(str,Next);
cout<<"Test case #"<<flag++<<endl;
for(int i = 2; i <= n; i++){
if(i % (i - Next[i]) == 0 && Next[i]){
cout<<i<<" "<<i / (i - Next[i])<<endl;
}
}
cout<<endl;
}
return 0;
}