码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1358 (求最小循环节)

时间:2015-07-15 18:21:49      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358

题意:大概就是说给你一个字符串,然后找出能够循环的子串,输出子串某位置以及循环节的个数。

题解:用KMP算法得到next数组。然后,从i=2开始遍历,得到的i-next[i]为循环节大小。

如果对于i能够整除循环节,并且next数组的值不为0(如果为0,则代表不循环,但却可以整除)

则代表这个位置是可行的,位置为i,循环节个数为i/(i-next[i])

 

代码如下:

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<string>
 6 using namespace std;
 7 const int maxn=1000005;
 8 int Next[maxn];
 9 char s[maxn];
10 void getNext(int len)
11 {
12     int i=0,j=-1;
13     Next[0]=-1;
14     while(i<len)
15     {
16         if(j==-1||s[i]==s[j])
17         {
18             i++;
19             j++;
20             Next[i]=j;
21         }
22         else
23             j=Next[j];
24     }
25 }
26 int main()
27 {
28     int t;
29     int temp=1;
30     while(~scanf("%d",&t))
31     {
32         if(t==0) break;
33         printf("Test case #%d\n",temp++);
34         scanf("%s",s);
35         int l=t;
36         getNext(l);
37         int k=l-Next[l];
38         for(int i=2;i<=l;i++)
39         {
40             k=i-Next[i];
41          if(!(i%k)&&Next[i])
42             printf("%d %d\n",i,i/k);
43         }
44         printf("\n");
45     }
46 }
View Code

 

HDU 1358 (求最小循环节)

标签:

原文地址:http://www.cnblogs.com/ikids/p/4648795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!