POJ_2406_Power Strings
/* 题意:求循环节最长长度 nt[]数组的分布: abcd -1 0 0 0 0 aaaa -1 0 1 2 3 abab -1 0 0 1 2 注意-1后再也没有出现过-1啦 */ #include<iostream> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define M 1000005 int lena,lenb,Max; int nt[M]; char b[M]; void getnt(char *b) { int j=0,k=-1; nt[0]=-1; while(j<lenb) { if(k==-1||b[j]==b[k]) //此举旨在找寻B串中重复的东东 { k++,j++; //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法 nt[j]=k; } else k=nt[k]; } /*for(int i=0; i<=lenb; ++i) printf("%d ",nt[i]); puts("");*/ } int main() { while(~scanf("%s",b)&&b[0]!='.') { lenb=strlen(b); getnt(b); int ok=lenb-nt[lenb]; if(nt[lenb]%ok==0) //如果是循环节 nt[lenb]最后一定会等比较大,然后%ok肯定会等于0 { printf("%d\n",lenb/ok); } else puts("1"); } }