HDU 1358 Period(KMP计算周期)

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

题目大意:给你一串字符串,判断字符串的前缀是否由某些字符串多次重复而构成。

也就是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”)

的两次组成,也就是aa有两个a组成;

第三行自然就是aabaab可有两个aab组成;

第四行aabaabaab可由三个aab组成;

第五行aabaabaabaab可由四个aab组成。

解题思路:同HDU 3746类似,通过计算字符串前缀的循环节获得相应周期即可。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1e6+5;
 7 
 8 int m;
 9 int nxt[N];
10 char p[N];
11 
12 void getnext(){
13     int i,j;
14     i=0,j=nxt[0]=-1;
15     while(i<m){
16         while(j!=-1&&p[i]!=p[j])
17             j=nxt[j];
18         nxt[++i]=++j;
19     }
20 }
21 
22 int main(){
23     int cas=0;
24     while(scanf("%d",&m)&&m){
25         scanf("%s",p);
26         getnext();
27         printf("Test case #%d
",++cas);
28         //枚举长度为2~m的字符串前缀
29         for(int i=2;i<=m;i++){
30             int mmin=i-nxt[i];          //len-nxt[len]为最小循环节
31             if(i!=mmin&&i%mmin==0)
32                 printf("%d %d
",i,i/mmin);
33         }
34         printf("
");
35     }
36     return 0;
37 }
原文地址:https://www.cnblogs.com/fu3638/p/8486483.html