hdu 1358 Period

题目链接: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\n",t++);
40         for(int i=2;i<=tlen;i++)
41         {
42             if(Next[i]!=0 && i%(i-Next[i])==0)
43                 printf("%d %d\n",i,i/(i-Next[i]));
44         }
45         printf("\n");
46     }
47     return 0;
48 }

 

posted @ 2016-07-29 15:22  pter  阅读(164)  评论(0编辑  收藏  举报