【POJ】1961 Period-KMP
阿新 • • 發佈:2018-12-15
傳送門:poj
題意
給定一個長度為n的字串S,求它每個字首的最短迴圈節。
題解
運用kmp判迴圈串: 對於位置,若,則存在迴圈節,迴圈節長度為 證明: 如圖: 設字串 由kmp性質顯然 同時 所以~全部相等,且為字首的最短迴圈節。(若有更短的迴圈節,必然更大)
程式碼
#include<cstdio> using namespace std; const int N=1e6+10; int n,nxt[N],kmp,TK; char s[N]; int main(){ int i; for(;;){ scanf("%d",&n); if(!n) break; scanf("%s",s+1); kmp=0; if(TK) puts(""); printf("Test case #%d\n",++TK); for(i=2;i<=n;++i){ for(;kmp && s[kmp+1]!=s[i];kmp=nxt[kmp]); kmp+=(s[kmp+1]==s[i]); nxt[i]=kmp; if(nxt[i]>0 && (i%(i-nxt[i]))==0) printf("%d %d\n",i,i/(i-nxt[i])); } } return 0; }