(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 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

3
aaa
12
aabaabaabaab
0

Sample Output

Test case #1
2 2
3 3

Test case #2
2 2
6 2
9 3
12 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");
	}
}
时间: 2024-10-18 16:35:50

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

poj1961 &amp; hdu 1358 Period(KMP)

poj 题目链接:http://poj.org/problem?id=1961 hdu题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 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

Hdu 1358 Period (KMP 求最小循环节)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目描述: 给出一个字符串S,输出S的前缀能表达成Ak的所有情况,每种情况输出前缀的结束位置和k. 解题思路: 打表算出next数组,然后对位置i求循环节,如果满足 i % (i - Next[i]) == 0 && Next[i] != 0,所对应的循环节(i - Next[i]), 循环次数是i / (i - Next[i]) 1 #include<cstdio> 2

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

hdu 1358 period KMP入门

Period 题意:一个长为N (2 <= N <= 1 000 000) 的字符串,问前缀串长度为k(k > 1)是否是一个周期串,即k = A...A;若是则按k从小到大的顺序输出k即周期数: Sample Input 3 aaa 12 aabaabaabaab 0 Sample Output Test case #1 2 2 3 3 Test case #2 2   2 6   2 9   3 12  4 题目其实是来自于LA的..挺好的一道题,用的是原版的kmp.. 写写对KMP

HDU 1358 Period(kmp简单解决)

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

HDU - 1358 - Period (KMP)

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

HDU 1358 Period 求前缀长度和出现次数(KMP的next数组的使用)

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

HDU 1358 Period KMP

题意:求一个字符串的所有前缀是否是复制出来的. 解题思路:next 数值判断即可 解题代码: 1 // File Name: getnext.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月09日 星期二 22时35分02秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<dequ

HDU 1358 Period(kmp)

next数组的应用 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #define L(x) (x<<1) #define R(x) (x<<1|1) #def