UVA1328Period(最小迴圈節)
阿新 • • 發佈:2018-11-10
https://cn.vjudge.net/problem/UVA-1328
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000005 int f[maxn]; char t[maxn]; using namespace std; int n; void getfail(char*t,int*f) { f[0]=f[1]=0; for(int i=1;i<n;i++) { int j=f[i]; while(j&&t[i]!=t[j]) j=f[j]; f[i+1]=(t[i]==t[j])?j+1:0; } } int main() {int w=0; while(~scanf("%d",&n)&&n) {memset(f,0,sizeof(f)); scanf("%s",t); w++; getfail(t,f); printf("Test case #%d\n",w); for(int i=2;i<=n;i++) if(f[i]>0&&i%(i-f[i])==0) printf("%d %d\n",i,i/(i-f[i])); printf("\n"); } return 0; }