HDU 1358 Period
2016-07-16 20:03
393 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
[/align]
[align=center][b]Total Submission(s): 6282 Accepted Submission(s): 3024[/b]
[/align]
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 file ends with a line, having the number zero on it.
by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
aaa
12
aabaabaabaab
0
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
思路:参见http://blog.csdn.net/viphong/article/details/48498595的证明过程。
附上AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
char p[maxn];
int f[maxn];
int n;
int main(){
int cas = 0;
while (~scanf("%d", &n) && n){
scanf("%s", p);
for (int i=1; i<n; ++i){
int j = f[i];
while (j && p[i]!=p[j])
j = f[j];
f[i+1] = (p[i]==p[j] ? j+1 : 0);
}
printf("Test case #%d\n", ++cas);
for (int i=2; i<=n; ++i)
if (f[i]>0 && i%(i-f[i])==0)
printf("%d %d\n", i, i/(i-f[i]));
printf("\n");
}
return 0;
}
Period
[align=center][b]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)[/b][/align]
[align=center][b]Total Submission(s): 6282 Accepted Submission(s): 3024[/b]
[/align]
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. Theinput 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 separatedby a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
Sample Input
3aaa
12
aabaabaabaab
0
Sample Output
Test case #12 2
3 3
Test case #2
2 2
6 2
9 3
12 4
Recommend
JGShining思路:参见http://blog.csdn.net/viphong/article/details/48498595的证明过程。
附上AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
char p[maxn];
int f[maxn];
int n;
int main(){
int cas = 0;
while (~scanf("%d", &n) && n){
scanf("%s", p);
for (int i=1; i<n; ++i){
int j = f[i];
while (j && p[i]!=p[j])
j = f[j];
f[i+1] = (p[i]==p[j] ? j+1 : 0);
}
printf("Test case #%d\n", ++cas);
for (int i=2; i<=n; ++i)
if (f[i]>0 && i%(i-f[i])==0)
printf("%d %d\n", i, i/(i-f[i]));
printf("\n");
}
return 0;
}
相关文章推荐
- 字符串的模式匹配详解--BF算法与KMP算法
- C语言kmp算法简单示例和实现原理探究
- C语言中实现KMP算法的实例讲解
- 基于KMP算法JavaScript的实现方法分析
- C语言实现字符串匹配KMP算法
- KMP算法精解及其Python版的代码示例
- KMP算法精解及其Python版的代码示例
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )