poj 2406 KMP求循环节

来源:互联网 发布:数据分析是什么工作 编辑:程序博客网 时间:2024/06/07 19:35

点击打开链接

#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;}


0 0