hdu1358Period(kmp)
来源:互联网 发布:如何打通淘宝人工客服 编辑:程序博客网 时间:2024/06/06 05:44
Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2314 Accepted Submission(s): 1143
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
3aaa12aabaabaabaab0
Sample Output
Test case #12 23 3Test case #22 26 29 312 4
求next数组,然后从2开始枚举就行了
#include <iostream>#include <cstring>using namespace std;const int MAXN = 1000005;char pattern[MAXN];int next[MAXN];void get_next(){ next[0]=next[1]=0; int m = strlen(pattern); for(int i=1; i<m; i++){ int j = next[i]; while(j && pattern[i]!=pattern[j]) j=next[j]; next[i+1]=(pattern[i]==pattern[j]? j+1 : 0); } for(int k=2; k<=m; k++){ int cir = k-next[k]; if(cir!=0 && k%cir==0){ int num = k/cir; if(num>1) cout<<k<<" "<<num<<endl; }else if(cir==0) cout<<k<<" "<<k<<endl; }}int main(){ int m; static int cnt = 0; while(cin>>m && m){ cin>>pattern; cout<<"Test case #"<<++cnt<<endl; get_next(); cout<<endl; } return 0;}
0 0
- hdu1358Period(kmp)
- hdu1358Period(KMP)
- hdu1358Period
- hdu1358Period(nxt找循环节)
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- 一个大型网站的演变史
- Ubuntu下安装eclipse
- 人造的风景 --- 东部华侨城一日游感想与收获
- Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2)
- 视频笔记
- hdu1358Period(kmp)
- Linux驱动之----硬件操作
- 使用C++获取文件路径,已获取当前路径为基础
- Qt学习之_01环境准备_Qt安装、Git安装、QtCreator配置
- 打开Flex3StyleExplorer_V3.0Beta.swf报错
- 电容的选择
- Spring Security教程(大纲)----学习过程分享
- PHOG descriptor
- Shell获取文件后缀名