poj 2406 KMP求迴圈節
阿新 • • 發佈:2019-02-08
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int M =10000100; char s[M]; int fail[M]; int len; void Fail() { int i=0,k=-1; len=strlen(s); fail[0]=-1; while(i<len) { if(k==-1||s[i]==s[k]) { fail[i+1]=k+1; i++; k++; } else { k=fail[k]; } } } int main() { while(scanf("%s",s)!=EOF&&s[0]!='.') { Fail(); int ans=1; // 123456 // 若fail[len]=5 -> 1234=3456 56=34 34=12 // len-fail[len] 錯位部分即為迴圈節部分 if(len%(len-fail[len])==0) ans=len/(len-fail[len]); cout<<ans<<endl; } return 0; }