【暑假】[实用数据结构]UVAlive 3026 Period
2015-08-11 20:59
465 查看
UVAlive 3026 Period
题目:
Period
Submit Status
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
Sample Output
题目:
Period
Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
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 思路: 利用KMP算法中的失配函数,如果是一个循环字串那么(i-f[i])必为一个循环节,因此只要判断(i%(i-f[i])==0) 可以整除则是循环字串。 代码:
#include<cstdio> #define FOR(a,b,c) for(int a=(b);a<(c);a++) using namespace std; const int maxn = 1000000 + 10; char s[maxn]; int f[maxn]; //大数组注意要开在函数外包括main int main(){ int kase=0,n; while(scanf("%d",&n)==1 && n){ scanf("%s",s); f[0]=f[1]=0; FOR(i,1,n){ int j=f[i]; while(j && s[i] != s[j]) j=f[j]; f[i+1]= s[i]==s[j]? j+1:0; } printf("Test case #%d\n",++kase); FOR(i,2,n+1){ //L+1 int k=i-f[i]; if(f[i]>0 && (i%k)==0) printf("%d %d\n",i,i/k); } printf("\n"); } return 0; }
需要注意大数组的声明位置。
相关文章推荐
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表六:有序链表的建立
- 数据结构(Java语言)——LinkedList简单实现
- 数据结构实验之链表五:单链表的拆分
- 【暑假】[实用数据结构]UVAlive 3942 Remember the Word
- 2924: 营业额统计-伸展树-Splay-数据结构-模板详解
- 数据结构-线性表(学习笔记)
- 数据结构_堆排序介绍
- 数据结构实验:哈希表
- NOIP2009 提高组 最优贸易 解题报告
- 数据结构_线段树_例题_ I Hate It(HDU 1754)
- C源码@数据结构与算法->栈Stack
- cocos2d-x 中的数据结构集合(容器)(CCArray,Map,Vector)使用笔记
- 初学数据结构之排序
- 数据结构之堆栈计算器
- C++类实现hash表的抽象数据结构(链式解决冲突)
- 数据结构(29)图的遍历
- 数据结构(28)图的实现
- 数据结构(27)二叉树的操作
- 数据结构(26)二叉树