[poj 1961]Period[kmp]
2016-07-18 11:16
309 查看
Period
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 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
Sample Output
Source
Southeastern Europe 2004
一句话题意:给一个字符串S,问S的最小循环节。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
#define N 1000010
char s
;
int nextval
;
int len;
void getnext(const char *s)
{
int i = 0, j = -1;
nextval[0] = -1;
while(i != len)
{
if(j == -1 || s[i] == s[j])
nextval[++i] = ++j;
else
j = nextval[j];
}
}
int main()
{
int T = 1;
int length, add;
while(scanf("%d", &len) && len)
{
scanf("%s", s);
getnext(s);
printf("Test case #%d\n", T++);
for(int i = 1; i <= len; ++i)
{
length = i - nextval[i]; //循环节的长度
if(i != length && i % length == 0) //如果有多个循环
printf("%d %d\n", i, i / length);
}
printf("\n");
}
return 0;
}
.
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 16202 | Accepted: 7764 |
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 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
Source
Southeastern Europe 2004
一句话题意:给一个字符串S,问S的最小循环节。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
#define N 1000010
char s
;
int nextval
;
int len;
void getnext(const char *s)
{
int i = 0, j = -1;
nextval[0] = -1;
while(i != len)
{
if(j == -1 || s[i] == s[j])
nextval[++i] = ++j;
else
j = nextval[j];
}
}
int main()
{
int T = 1;
int length, add;
while(scanf("%d", &len) && len)
{
scanf("%s", s);
getnext(s);
printf("Test case #%d\n", T++);
for(int i = 1; i <= len; ++i)
{
length = i - nextval[i]; //循环节的长度
if(i != length && i % length == 0) //如果有多个循环
printf("%d %d\n", i, i / length);
}
printf("\n");
}
return 0;
}
.
相关文章推荐
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- C语言实现字符串匹配KMP算法
- Java实现KMP算法
- 字符串算法--KMP--Java实现
- 初学ACM - 组合数学基础题目PKU 1833
- KMP算法(转载)
- kmp算法实现
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- [OpenJudge]带有通配符的字符串匹配
- KMP算法详解
- linux kernel data struct: KMP算法实现
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points