来源:POJ1961
就是中间记录一下就好了
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
//求周期串
int len;
string str;
const int MAXN = 1000000+10;
int nxt[MAXN];
void get_next(){
int i=0,j=-1;
nxt[0]=-1;
while(i<len){
while(-1!=j&&str[i]!=str[j]) j =nxt[j];
nxt[++i] = ++j;
}
}
struct Node{
int TT;
int len;
}ans[100100];
int main(){
int nc=1;
while(scanf("%d",&len)!=EOF&&len){
cin>>str;
get_next();
/* for(int i=0;i<len;i++)
cout<<nxt[i]<<" ";
cout<<endl;*/
int k=0;
for(int i=1;i<=len;i++){
int t=i;
int TTT=-1;
TTT = t-nxt[t];
if(t!=TTT&&t%TTT==0)
{
//cout<<"yes"<<endl;
ans[k].len=i;
ans[k].TT=i/TTT;
k++;
}
}
cout<<"Test case #"<<nc++<<endl;
for(int i=0;i<k;i++){
cout<<ans[i].len<<" "<<ans[i].TT<<endl;
}
cout<<endl;
}
return 0;
}