#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; char c[1000001]; int n,cnt,nex[1000001]; int main(){ while(scanf("%d",&n)&&n){ scanf("%s",c+1); nex[1]=0; for(int i=2,j=0;i<=n;i++) { while(j>0&&c[i]!=c[j+1]){j=nex[j];} if(c[i]==c[j+1]){j++;} nex[i]=j; } printf("Test case #%d\n",++cnt); for(int i=2;i<=n;i++){ if(!(i%(i-nex[i]))&&(i/(i-nex[i]))>=2){ printf("%d %d\n",i,i/(i-nex[i])); } } cout<<endl; } return 0; }
切记,一定要注意换行问题。
我就是在这上面错了好几次。
原文:https://www.cnblogs.com/xiongchongwen/p/11135469.html