http://acm.hdu.edu.cn/showproblem.php?pid=3746
kmp的Nxet数组求字符串循环节例题
lenB%(lenB-Next[lenB])==0则其有周期lenB/(lenB-Next[lenB]),其中最小循环节长度是lenB-Next[lenB]
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std ; char B[100005] ; int Next[100005],lenB ; void GetNext() { int i,j ; Next[1]=0 ; j=0 ; for(i=2 ;i<=lenB ;i++) { while(j>0 && (B[j+1]!=B[i]))j=Next[j] ; if(B[j+1]==B[i])j++ ; Next[i]=j ; } } int main() { int t ; scanf("%d",&t) ; while(t--) { scanf("%s",B+1) ; lenB=strlen(B+1) ; GetNext() ; int minn=lenB-Next[lenB] ; if(!Next[lenB])printf("%d\n",lenB) ; else if(lenB%minn) printf("%d\n",minn-lenB%minn) ; else printf("0\n") ; } return 0 ; }