题意
求所有循环次数大于1的前缀
的最大循环次数和前缀位置
解法
直接用KMP求最小循环节
当满足i%(i-next[i])&&next[i]!=0
前缀循环次数大于1
最小循环节是i-next[i]
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
char S[2000000];
int NEXT[2000000];
int len;
int CASE=0;
void get_next()
{
for(int i=1;i<=len;i++)
{
int p=i-1;
while(S[i]!=S[NEXT[p]+1]&&p!=0) p=NEXT[p];
if(p!=0)
NEXT[i]=NEXT[p]+1;
}
}
int main()
{
int N;
// freopen("a.in","r",stdin);
while(cin>>N&&N)
{
memset(S,0,sizeof(S));
memset(NEXT,0,sizeof(NEXT));
printf("Test case #%d
",++CASE);
scanf("%s",S+1);
len=strlen(S+1);
get_next();
for(int i=1;i<=len;i++)
{
if(i%(i-NEXT[i])==0&&NEXT[i]!=0)
{
printf("%d %d
",i,i/(i-NEXT[i]));
}
}
printf("
");
}
}