题目大意
给定一个长度为n的字符串,求它的每个前缀的最短循环节
题解
白书例题~~~
”错位部分“长度为i-f[i],
如果这个前i个字符能够组成一个周期串,那么”错位”部分刚好是一个循环节i-f[i]就是循环节长度~~~~
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 1000005 int f[MAXN]; char p[MAXN]; int main() { int n,j,cases=1; while(scanf("%d",&n)!=EOF&&n) { printf("Test case #%d ",cases++); scanf("%s",p); int len=strlen(p); f[0]=j=-1; for(int i=1;i<len;i++) { while(j>=0&&p[j+1]!=p[i]) j=f[j]; if(p[j+1]==p[i]) j++; f[i]=j; } for(int i=1;i<len;i++) if(f[i]>=0&&((i+1)%(i-f[i])==0)) printf("%d %d ",i+1,(i+1)/(i-f[i])); printf(" "); } return 0; }