poj1961 Period(KMP)

C - Period

Crawling in process...
Crawling failed
Time Limit:3000MS    
Memory Limit:30000KB     64bit IO Format:%I64d & %I64u

Submit
Status Practice POJ 1961

Appoint description:
System Crawler (2016-05-10)

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 A
K ,that is A concatenated K times, for some string A. Of course, we also want to know the period K.

Input

The input 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

第二次做KMP算法了  可惜的是我见到了都不知道是要用KMP算法做  唉

上次做也没有深刻理解next数组的意义  做了这道题 让我理解到 (仅仅是我的理解,错了别喷我。。)next数组的作用就是在匹配主串的时候

遇到了不相同的字符 通过next数组快速跳过已经匹配过的字符。具体解释请看这位大牛写的

做了这道题也知道了next数组可以找循环节 唉 真的想不到

#include <stdio.h>
int next[1000000+10];
char str[1000000+10];
int n;
void set_next()
{
	int i=-1;
	int j=0;
	next[0]=-1;
	while(j<n)
	{
		if(i==-1||str[i]==str[j])
		{
			i++;j++;
			next[j]=i;
		}
		else
		i=next[i];
	}
}
int main()
{
	int t=0;
	while(~scanf("%d",&n)&&n)
	{
		scanf("%s",str);
		set_next();
		printf("Test case #%d\n",++t);
		for(int i=1;i<=n;i++)
		{
		//	printf("%d\n",next[i]);
			int length=i-next[i];
			if(i!=length&&i%length==0)
			printf("%d %d\n",i,i/length);
		}
		printf("\n");
	}
}
时间: 2024-10-14 19:17:38

poj1961 Period(KMP)的相关文章

poj1961 Period kmp解决找字符串的最小循环节

/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个),输出前缀字符串长度以及最大的循环周期: 思路: 参考自:http://www.cnblogs.com/chenxiwenruo/p/3546457.html 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0-len-next[len]-1]. (1)

POJ1961 Period (kmp) 题解

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 16462   Accepted: 7903 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

LA3026 - Period(KMP)

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 the

hdu oj Period (kmp的应用)

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

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

poj1961(kmp算法next数组应用)

题目链接:https://vjudge.net/problem/POJ-1961 题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i)是周期子串,输出其最大周期. 思路: 考察对kmp算法中next数组的定义掌握,如果(i+1)%(i-j)==0 && (i+1)/(i-j) > 1,那么该子串即为满足条件. AC代码: #include<cstdio> #include<algorithm>

POJ1961 Period

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 18405   Accepted: 8920 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

UVA 1328 - Period KMP

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36131 题意:给出一个长度为n的字符串,要求找到一些i,满足说从1~i为多个个的重复子串构成,并输出子串的个数. 题解:对kmp中预处理的数组的理解 //作者:1085422276 #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #i

hdu1358 Period(kmp周期)

题目链接:点击打开链接 题意描述:给一个字符串,求这个字符串中每个前缀自身是否有周期性? 解题思路:kmp即可 代码: #include <cstdio> #include <cstring> #define MAXN 1000010 using namespace std; void getNext(char* str,int len,int* next){ int i,j; j=next[0]=-1; i=0; while(i<len){ while(j!=-1&