(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
来源:互联网 发布:java大牛博客 编辑:程序博客网 时间:2024/05/16 11:25
题目:
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 ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as AK , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
Input
The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on it.
Output
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
Sample Input
3aaa12aabaabaabaab0
Sample Output
Test case #12 23 3Test case #22 26 29 312 4
Recommend
JGShining | We have carefully selected several similar problems for you: 3336 3068 2203 1277 1867
题目分析:
KMP。简单题。这一道题其实和KMP 1.4那道题的思想是一样的。
代码如下:
/* * hdu1358.cpp * * Created on: 2015年4月18日 * Author: Administrator */#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1000001;int m;//目标串的长度char pattern[maxn];//模式串int nnext[maxn];//next数组.直接起next可能会跟系统中预定的重名./*O(m)的时间求next数组*/void get_next() {m = strlen(pattern);nnext[0] = nnext[1] = 0;for (int i = 1; i < m; i++) {int j = nnext[i];while (j && pattern[i] != pattern[j])j = nnext[j];nnext[i + 1] = pattern[i] == pattern[j] ? j + 1 : 0;}}int main(){int cnt = 1;while(scanf("%d",&m)!=EOF,m){scanf("%s",pattern);get_next();printf("Test case #%d\n",cnt++);/** * 遍历next数组。 * 输出循环节数>=2的情况 */int i;for(i = 0 ; i <= m ; ++i){if(nnext[i] == 0){continue;}int len = i - nnext[i];if(i%len == 0){printf("%d %d\n",i,i/len);}}printf("\n");}}
1 0
- (KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
- 【kmp算法next数组-串的最小循环节/循环周期】Period HDU
- (KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数>=2)
- HDU 1358 Period (next跳表找最小循环节)KMP
- KMP + 求最小循环节 --- HDU 1358 Period
- KMP next数组求最小循环节
- hdu 1358 period 求循环节 KMP
- HDU-1358 Period(KMP求循环节)
- POJ 1961 Period——kmp求最小循环节
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- [KMP求最小循环节][HDU1358][Period]
- hdu 3746 kmp next求最小循环节
- HDU 1358 Period(next数组+周期+循环节)
- HDu 1358 Period(Next 数组找循环节)
- Period--KMP,最小循环节
- HDU 1358 Period (kmp求循环节)
- kmp的next数组的运用(求字符串的最小循环节)
- LA 3026 Period——kmp求n次最小循环节
- java集合包List、Set、Map总结
- 每个Java开发者都应该知道的5个JDK工具
- 2015年4月9号和4月11号
- leetcode 日经贴,Cpp code -Remove Duplicates from Sorted List II
- 浅谈web开发的安全问题
- (KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
- 修改maven surefire源码,支持stdout出成功和skipped用例,并自定义stdout用例格式
- spring的p标签赋值
- win32编程中对话框处理函数最后的返回值为TRUE导致了程序异常
- 2015-4-12
- C++指针详解
- Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法
- 指针
- hdu 5058 So easy (set)