题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
思路:Next数组的用法,在第i个位置上如果有i%(i-Next[i])==0的话最小循环节就是T[0~i],共有i/(i-Next[i])个循环节
题意就是让从第二个位置开始找出有循环的位置节并输出循环节个数
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<vector> 7 #include<queue> 8 #include<iterator> 9 #include<vector> 10 #include<set> 11 #define dinf 0x3f3f3f3f 12 typedef long long ll; 13 14 using namespace std; 15 16 const int N = 100000005; 17 int Next[N],tlen; 18 char T[N]; 19 20 void getNext() 21 { 22 Next[1]=0; 23 int i,j=0; 24 for(i=2;i<=tlen;i++) 25 { 26 while(j>0&&T[j+1]!=T[i]) j=Next[j]; 27 if(T[j+1]==T[i]) j+=1; 28 Next[i]=j; 29 } 30 } 31 32 int main() 33 { 34 int cas,t=1; 35 while(scanf("%d",&tlen),tlen) 36 { 37 scanf("%s",T+1); 38 getNext(); 39 printf("Test case #%d ",t++); 40 for(int i=2;i<=tlen;i++) 41 { 42 if(Next[i]!=0 && i%(i-Next[i])==0) 43 printf("%d %d ",i,i/(i-Next[i])); 44 } 45 printf(" "); 46 } 47 return 0; 48 }