UVA 1328 Period(KMP:最短迴圈節的有無及長度)
阿新 • • 發佈:2018-12-10
要明確判斷條件
充分利用next陣列就行
#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; } for(int i=1; i<=n; i++) { cout<<f[i]<<" "<<i<<endl; } //輸出每一個字元位置上的next(f)陣列的值 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"); //如果f陣列>0並且i可以整除(i-f[i])就是迴圈節 } return 0; }