UVA 1328 Period(KMP:最短迴圈節) 模板
阿新 • • 發佈:2018-11-22
題意:對於一個字串,求它的所有字首的最短迴圈節.比如對於前i(i>=2)個字元構成的子串,該串是由某個更小的子串重複k(k>=2)次形成的.由於要求最短迴圈節,所以對於同一字首來說,k儘量大.
如果前i(i>=2)個字元(即0到i-1字元)是一個週期串,那麼錯位部分就是一個最短迴圈節,i%(i-f[i])==0且K=i/(i-f[i]).
反之,如果i%(i-f[i]) !=0 或 K<2 ,該字首就不是週期串.
模板:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int MAXN=1000000+10; int f[MAXN]; char P[MAXN]; int main() { int n,kase=1; while(scanf("%d",&n)==1&&n) { scanf("%s",P); f[0]=f[1]=0; for(int i=1;i<n;i++) { int j=f[i]; while(j && P[i]!=P[j]) j=f[j]; f[i+1]= P[i]==P[j]?j+1:0; } printf("Test case #%d\n",kase++); 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; }