POJ_1961_Period

/*
求循环节和循环周期
已经保证一定是循环字符串
*/ #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() { int t=1; while(~scanf("%d",&lenb)&&lenb) { scanf("%s",b); getnt(b); printf("Test case #%d\n",t++); for(int i=2;i<=lenb;++i) { int ok=i-nt[i]; if(nt[i]%ok==0&&ok!=i) { printf("%d %d\n",i,i/ok); } } puts(""); } }

 

posted @ 2013-05-11 21:20  小仪在努力~  阅读(160)  评论(0编辑  收藏  举报