HDU 1358 (求最小循环节)

题目链接: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 }

时间: 2024-11-09 06:02:48

HDU 1358 (求最小循环节)的相关文章

KMP + 求最小循环节 --- POJ 2406 Power Strings

Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少次得到. analyse: KMP之next数组的运用.裸的求最小循环节. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Accepted* Submission Date: 20

(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)

题目: Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3813    Accepted Submission(s): 1862 Problem Description For each prefix of a given string S with N characters (each character has an A

模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串. 例: abca---添加bc,成为abcabc abcd---添加abcd,成为abcdabcd aa---无需添加 analyse: 经典的求最小循环节. 首先给出结论:一个字符串的最小循环节为:len-next[len]. 证明: 举个例子:abcab

KMP + 求最小循环节 --- HDU 1358 Period

Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度的字符串是否是重复串,如果是,输出当前位置,并输出重复串的周期. analyse: 还是next数组的运用,详见上一篇博客. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Acce

nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】

循环小数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循环小数这一部分时不是太明白循环体是什么意思(比如说3.23232323的循环体是23.2323.23232323),假设我们现在的循环小数都是严格循环的并且有限的,也就是说不出现2.16666666(循环体为6,长度为1)的情况,只有123123这样的循环出现.给他一个小数,他需要找出最小循环体的长度.循环体和循环的次数,请你帮他解决这个问题. 输入 输

poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the

hdu 1358 Period 最小循环节

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 分析:已知字符串,求其由最小循环节构成的前缀字符串. /*Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3507 Accepted Submission(s): 1766 Problem Description For ea

KMP解决字符串最小循环节相关问题

经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个结论 如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:    i - next[i] 循环次数为:       i / ( i - next[i] ) 水平有限,用自己的语言描述怕

POJ 2406 Power Strings (求字符串循环节出现的次数)

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 44217   Accepted: 18449 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "