题目链接:https://vjudge.net/problem/HDU-1358
利用next数组找循环节,判断字符串每个前缀是否有一个以上的循环节构成,如果是输出位置及循环次数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1000000+10;
char b[N];
int next0[N];
void find_next()
{
int len=strlen(b);
int k=-1;
next0[0]=-1;
int j=0;
while(j<len)
{
if(k==-1||b[j]==b[k])
{
j++;
k++;
next0[j]=k;
}
else
{
k=next0[k];
}
}
}
int main()
{
int n,kase=0;
while(~scanf("%d",&n)&&n)
{
scanf("%s",b);
printf("Test case #%d\n",++kase);
find_next();
for(int i=1;i<=n;i++)
{
int t=i-next0[i];
if(t!=i&&i%t==0) printf("%d %d\n",i,i/t);
}
printf("\n");
}
return 0;
}