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模板题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
using namespace std; const int maxn = 1000000+10;
int next[maxn];
int n;
string str; vector<int> find(string T,string P){
int n = T.size(),m = P.size();
vector<int> vn;
getNext(P,next);
for(int i = 0,j = 0; i < n; i++){
while(j&&P[j] != T[i]) j = next[j];
if(P[i]==T[j]) j++;
if(j==m) vn.push_back(i-m+1);
}
return vn; } void getFail(string st,int *f){
int m = st.size();
next[0] = 0;
next[1] = 0;
int len = 1;
for(int i = 1; i < m; i++){
int j = next[i];
while(j && st[i] != st[j]) j = next[j];
if(st[i]==st[j]){
next[i+1] = j+1;
}else{
next[i+1] = 0;
}
}
}
int main(){
int T = 1;
while(~scanf("%d",&n) && n){
cin >> str;
printf("Test case #%d\n",T++);
getFail(str,next);
for(int i = 2; i <= n; i++){
if(next[i]> 0&&i%(i-next[i])==0){
cout<<i<<" "<<i/(i-next[i])<<endl;
}
}
cout<<endl;
}
return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

最新文章

  1. check time period
  2. final finally finalize 区别
  3. session的销毁
  4. 使用 CSS3 制作一组超时尚的动画按钮效果
  5. nodejs模块——Event模块
  6. HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
  7. javascript 数据类型 变量 类型转换运算符
  8. 学习记录013-NFS相关知识点
  9. Sqli-labs less 42
  10. 【转】Win8/8.1/Win7小技巧:揪出C盘空间占用的真凶
  11. angularjs执行流程
  12. POJ 1065 Wooden Sticks#贪心+qsort用法
  13. thinkPHP16---伪静态
  14. Java去除字符串中的空格
  15. Codeforces 890C - Petya and Catacombs 模拟
  16. 阿里云Maven配置,Maven仓库配置,Maven镜像配置
  17. jQuery ajax中使用serialize()方法提交表单数据示例
  18. About Gnu Linker1
  19. 【C++/实验三】类和对象
  20. # 2019-2020-3 《Java 程序设计》实验一:Java开发环境的熟悉

热门文章

  1. poj1087(最大流)
  2. 智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战
  3. 敏捷开发-Scrum 真实
  4. poj 1011 Sticks ,剪枝神题
  5. Wix打包系列(七) 添加系统必备组件的安装程序
  6. hdu1978(递推dp)
  7. Phalcon之 表单(Forms)
  8. MySQL中CASE的使用
  9. SWT的GridData一些参数的图示
  10. Cocos2d-x中父节点scale对子节点的影响