For each prefix with length P of a given string S,if

S[i]=S[i+P] for i in [0..SIZE(S)-p-1],

then the prefix is a “period” of S. We want to all the periodic prefixs.

Input

Input contains multiple cases.

The first line contains an integer T representing the number of cases. Then following T cases.

Each test case contains a string S (1 <= SIZE(S) <= 1000000),represents the title.S consists of lowercase ,uppercase letter.

Output

For each test case, first output one line containing "Case #x: y", where x is the case number (starting from 1) and y is the number of periodic prefixs.Then output the lengths of the periodic prefixs in ascending order.

Sample Input

  1. 4
  2. ooo
  3. acmacmacmacmacma
  4. fzufzufzuf
  5. stostootssto

Sample Output

  1. Case #1: 3
  2. 1 2 3
  3. Case #2: 6
  4. 3 6 9 12 15 16
  5. Case #3: 4
  6. 3 6 9 10
  7. Case #4: 2
  8. 9 12
    题意:找前缀后缀相同的地方
    题解:kmp next数组(我居然没想到@。@)想成最小环了。。。
  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<queue>
  5. #include<stack>
  6. #include<vector>
  7. #include<cstdio>
  8. #include<iomanip>
  9. #include<cstdlib>
  10. #include<cstring>
  11. #include<iostream>
  12. #include<algorithm>
  13. #define pi acos(-1)
  14. #define ll long long
  15. #define mod 1000000007
  16.  
  17. using namespace std;
  18.  
  19. const int N=+,maxn=+,inf=1e9+;
  20.  
  21. int Next[N],slen,plen;
  22. string str,ptr;
  23.  
  24. void getnext()
  25. {
  26. Next[]=-;
  27. int k=-;
  28. for(int i=;i<slen;i++)
  29. {
  30. while(k>-&&str[k+]!=str[i])k=Next[k];
  31. if(str[k+]==str[i])k++;
  32. Next[i]=k;
  33. }
  34. }
  35. bool kmp()
  36. {
  37. int k=-;
  38. for(int i=;i<plen;i++)
  39. {
  40. while(k>-&&str[k+]!=ptr[i])k=Next[k];
  41. if(str[k+]==ptr[i])k++;
  42. if(k==slen-)return ;
  43. }
  44. return ;
  45. }
  46. int main()
  47. {
  48. ios::sync_with_stdio(false);
  49. cin.tie();
  50. int t,n,cnt=;
  51. cin>>t;
  52. while(t--){
  53. cin>>str;
  54. slen=str.size();
  55. getnext();
  56. for(int i=;i<slen;i++)
  57. cout<<Next[i]<<" ";
  58. cout<<endl;
  59. vector<int>q;
  60. int k=Next[slen-],loop=slen-Next[slen-]-;
  61. while(k!=-){
  62. q.push_back(slen--k);
  63. k=Next[k];
  64. }
  65. q.push_back(slen);
  66. /* cout<<"Case #"<<++cnt<<": "<<q.size()<<endl;
  67. for(int i=0;i<q.size();i++)
  68. cout<<q[i]<<(i==q.size()-1 ? "\n":" ");*/
  69. }
  70. return ;
  71. }

fzu1901 kmp的更多相关文章

  1. FZU1901 Period II —— KMP next数组

    题目链接:https://vjudge.net/problem/FZU-1901  Problem 1901 Period II Accept: 575    Submit: 1495Time Lim ...

  2. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  3. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  4. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  5. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  6. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  7. [KMP]【学习笔记】

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Descript ...

  8. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

  9. KMP专题

    1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...

随机推荐

  1. linux 中的定时任务crontab使用方法

    linux 中的定时任务crontab使用方法: 切换到root用户,sudo su root (可以设置成不需要输入密码) sudo su - (需要输入当前帐号的密码才能进入.) crontab ...

  2. STM8S003F3通过PWM波实现三基色呼吸灯(转)

    源: STM8S003F3通过PWM波实现三基色呼吸灯

  3. 20145304 Exp7 网络欺诈技术防范

    20145304 Exp7 网络欺诈技术防范 实验后回答问题 1.通常在什么场景下容易受到DNS spoof攻击 在公共网络下,如一些购物场所.咖啡馆.快餐店等提供的网络下:当自己常使用的无线网被有恶 ...

  4. 20145337《网络对抗技术》MSF基础应用

    20145337<网络对抗技术>MSF基础应用 一.实验后回答问题 什么是exploit.payload.encode Metasploit这种模块化的设计,大大提高了代码的复用率.exp ...

  5. 使用ShellExecute打开默认程序(邮件客户端)

    转载:http://www.cnblogs.com/xubin0523/archive/2012/11/01/2749729.html ShellExecute ShellExecute的功能是运行一 ...

  6. SQLSERVER 数据从一张那个表复制到另一张表

    insert into 表名1 ( 字段A ,字段B ,字段C) SELECT 字段A ,字段B ,字段C FROM 表名2 (where条件看情况而定)

  7. tslib移植笔记(1)【转】

    本文转载自:https://blog.csdn.net/zijie_xiao/article/details/50740950 tslib移植笔记(1)2016-04-25 tslib背景[摘自百度] ...

  8. Linux内存管理--用户空间和内核空间【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/12045255 关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用 ...

  9. 【附2】hystrix详述(2)- 配置

    一.hystrix在生产中的建议 1.保持timeout的默认值(1000ms),除非需要修改(其实通常会修改) 2.保持threadpool的的线程数为10个,除非需要更多 3.依赖标准的报警和监控 ...

  10. 【TCP/IP详解 卷一:协议】TCP定时器 小结

    前言 在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的. 四种定时器: 2MSL定时器,出现在 ...