循环节是i-next[i];
第一次超时是没直接用n,多用了strlen;
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int nextt[1000005];
char s[1000005];
int n;
void Pre_next(char s[])
{
int k,j;
j=0;
nextt[0]=k=-1;
while(j<n){
if(k==-1||s[j]==s[k])
nextt[++j]=++k;
else k=nextt[k];
}
}
int main()
{
int cnt=0;
while(scanf("%d",&n)){
if(n==0) break;
scanf("%s",s);
Pre_next(s);
printf("Test case #%d\n",++cnt);
for(int i=1;i<=n;i++){
int len=i-nextt[i];
if(i!=len&&i%len==0)
printf("%d %d\n",i,i/len);
}
printf("\n");
}
}