来源: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;
}
本文介绍了一个用于寻找周期字符串的有效算法。通过预处理字符串并利用next数组来确定输入字符串中的所有周期,该算法能够快速地找出所有符合条件的周期及其出现次数。代码示例展示了如何实现这一算法,并通过一个具体的案例进行验证。
1657

被折叠的 条评论
为什么被折叠?



