Description

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

4
ooo
acmacmacmacmacma
fzufzufzuf
stostootssto

Sample Output

Case #1: 3
1 2 3
Case #2: 6
3 6 9 12 15 16
Case #3: 4
3 6 9 10
Case #4: 2
9 12 参考代码:

#include <cstdio>

#include <cstring>

const int maxn = 1000010;

int p[maxn],ans[maxn];

char str[maxn]; //保存字符串的数组

void get_p(int len){

p[1] = 0;

int j = 0;

for(int i = 2;i <= len;i++){

while(j > 0 && str[j+1] != str[i])  j = p[j];

//这个循环是当结果失配时才使用的

if(str[j+1] == str[i])  j++;

p[i] = j;

}

}

int main(){

int nkase;

scanf("%d",&nkase);

for(int kase = 1;kase <= nkase;kase++){

scanf("%s",str+1);

// 这个+1表示的含义是从下标为1的地方开始输入,方便后续的操作

//像C中这样控制字符串输入的格式还是非常方便的

int len = strlen(str+1);

get_p(len);

//这个是单单初始化了数组p得到了结果,然后主要的思想未知,可能是在求解next数组

//将str的长度告诉函数,通过匹配的方式得到数组p,相当于next数组

int t = p[len],cnt = 0;

while(t){

ans[cnt++] = len-t;

t = p[t];

//每次取到的数值是一定会比以前的要小,所以这不可能是一个死循环的

}

ans[cnt++] = len;

//在这里将所有的运算结果全部保留下来,包括数量cnt和最后输出的结果ans[];

printf("Case #%d: %d\n",kase,cnt);

//在这里有两个参数,即运行的次数和返回的结果数

for(int i = 0;i < cnt-1;i++)  printf("%d ",ans[i]);

printf("%d\n",ans[cnt-1]);

}

return 0;

}

关键点分析:

本题还是要先找到next数组,然后通过next数组来访问求解。

当然,每个next数组保存的内容都是不一样的,都是前一个字符匹配得到的信息结果保留在那个地方。

//KMP的算法重点就是求解next数组,当求解next数组时要知道关键点就是next数组中保存的数据是什么意思,那是当失配的时候后缀部分和前面的部分是否相同的表现

KMP算法类习题——字符串匹配的更多相关文章

  1. 【KMP算法】字符串匹配

    一.问题 给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置. 二.朴素算法 当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较.    (1) 成功匹配的部分(AB ...

  2. C++编程练习(7)----“KMP模式匹配算法“字符串匹配

    子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...

  3. KMP算法解决字符串匹配问题

    要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...

  4. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  5. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  6. 字符串匹配的KMP算法

    ~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...

  7. {Reship}{KMP字符串匹配}

    关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827

  8. 字符串匹配的KMP算法详解及C#实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  9. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

随机推荐

  1. sqlserver和Windows资源管理器争用内存

    sqlserver和Windows资源管理器在设置成相同的优先级的情况下(普通),Windows资源管理器优先于sqlserver对内存的征用.开始是

  2. mysql5.7.14 配置

    1. 下载并解压 zip包 2.将解压后的目录 bin  配置到path中 3.修改my-default.ini 文件名为my.ini 4.配置my.ini [mysql] #设置mysql客户端默认 ...

  3. windows 激活等命令

    Win+R 输入:slmgr.vbs -dlv 显示:最为详尽的激活信息,包括:激活ID.安装ID.激活截止日期slmgr.vbs -dli 显示:操作系统版本.部分产品密钥.许可证状态slmgr.v ...

  4. javascript location对象

    location用于获取或设置窗体的URL,并且可以用于解析URL. location.[属性|方法] 1.location对象属性图示: 2.location 对象属性: 3.location 对象 ...

  5. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  6. CentOS启动不显示图形界面直接进入命令行模式

    我现在用的是 CentOS 6.3 开机后进入图形化界面还是进入命令行取决于inittab文件中的配置.该文件位于etc目录下. # vi /etc/inittab 找到下面的语句: # Defaul ...

  7. jquery 里 $(this)的用法

    当遇到循环table时,查看其中的td.tr属性和值会有一点的麻烦.此时就必须使用$(this)来解决这一类的问题了. 1.直接使用 2.间接使用 <table> <?php for ...

  8. 关于input在li列表中居中显示

    input属于置换元素(replaced element),置换元素主要是指img,input,textarea,select,object等这类默认就有CSS格式化外表范围的元素,这些元素的垂直居中 ...

  9. react中文API解读二(教程)

    记下自己的react学习之路 ,官方文档写的很详尽,学起来应该比较简单 官方文档地址:react.http://reactjs.cn/react/docs/getting-started.html 2 ...

  10. [SOJ]1753 解码

    1753. 解码 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description ZX是另一头04级的牛,他现在在UPen.他跟LLK经 ...