kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧。

朴素的字符串匹配大家都懂,但是效率不高,原因在哪里?

匹配过程没有充分利用已经匹配好的模版的信息,比如说,

i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标。(下标都从零开始,j同时可以表示已经匹配的字符长度)

当匹配到i = 4, j = 4的时候失配了,朴素的匹配做法是往右边移一位然后从j开始扫,这样做效率很低。

不难发现前面已经匹配好的串ab是最长公共前缀后缀。把串移动到后缀的第一个位置正好是

朴素的匹配过程中第一次匹配能把这个前缀匹配匹配完的位置!因此令j = f[j-1] = 2。

模版串下面这个f数组又是怎么来的呢?

寻找最长公共前缀后缀过程本质上也是一个匹配。

i表示当前要求f[i]的下标,j表示之前串已经匹配的最大前缀后缀长度。(j = -1表示0号位置也没有匹配上)

当i = 6时,之前已经匹配了j个,所以只要i只要从j下标位置开始比较就行了。当匹配的时候f[i] = j+1。

如果不匹配,利用前面已经得到的f值进行匹配。

当i = 7, j = 3时,发生失配,利用之前的f值,可以知道a是最长的前缀和后缀,那么只需要从a开始匹配,因此令j = f[j-1],

重复上述过程直到匹配或j = -1的时候为止。当前就等于: f[i] = j+1。(j=-1表示没有匹配也是为了方便统一处理)

在代码中,因为当j = 0的时候,j = f[j-1]不好表示,因此把整个f数组向右边移动一位。此时只需把上述过程的j = f[j-1]替换成j = f[j]。

----------------------------------------------分割线----------------------------------------------------------------

这道题要求前缀的最小循环周期。

先构造一个循环的串,然后进行求失配函数f的过程,当第一次前缀长度等于后缀长度并且各占一半的时候,这个前缀一定是最小的循环节。(从第一个结论开始用归纳法证明)

可以归纳出一个结论:在每个循环节终止的位置 i-f[i] ==最短循环节长度。

反过来i能被(i-f[i])整除可以推出i-f[i]是最短循环节。(同样用归纳法)

kmp之前不太理解,只会套。为学习ac自动机,先把的kmp基础打好。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
int f[maxn];
char str[maxn]; void getF(char *s)
{
f[] = -;
for(int i = , j = -; s[i]; ){
while(~j && s[i] != s[j]) j = f[j];
f[++i] = ++j;
}
} int main()
{
//freopen("in.txt","r",stdin);
int n,kas = ;
while(scanf("%d\n",&n),n){
gets(str);
getF(str);
printf("Test case #%d\n",++kas);
for(int i = ; i <= n; i++){
if(f[i] && i%(i-f[i]) == )
printf("%d %d\n",i,i/(i-f[i]));
}
putchar('\n');
}
return ;
}

UVALive 3026 Period (KMP算法简介)的更多相关文章

  1. UVALive 3026(KMP算法)

    UVALive 3026     KMP中next[]数组的应用: 题意:给出一个字符串,问该字符串每个前缀首字母的位置和该前缀的周期. 思路:裸KMP直接上就是了: 设该字符串为str,str字符串 ...

  2. UVALive - 3026 Period kmp next数组的应用

    input n 2<=n<=1000000 长度为n的字符串,只含小写字母 output Test case #cas 长度为i时的最小循环串 循环次数(>1) 若没有则不输出 做法 ...

  3. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

    参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - n ...

  4. 【暑假】[实用数据结构]UVAlive 3026 Period

    UVAlive 3026 Period 题目: Period   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld ...

  5. POJ 1961 Period KMP算法之next数组的应用

    题意:给一个长度为n的字符串,如果它长度为l(2 <= l <= n)的前缀部分是由一些相同的字符串相接而成,输出前缀的长度l和长度为l时字符串重复的最大次数. 例如字符串为: aaaba ...

  6. POJ 1961 Period KMP算法next数组的应用

    题目: http://poj.org/problem?id=1961 很好的题,但是不容易理解. 因为当kmp失配时,i = next[i],所以错位部分就是i - next[i],当s[0]...s ...

  7. LA 3026 - Period KMP

    看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  8. UVALIVE 3026 Period

    题意:给你一个字符串,问第i位前是否有循环节,若存在,则循环节是多少? 思路:考察失配函数f[i]的意义.只要i%(i-f[i])==0,则循环节长度为i/(i-f[i]).字符在[0,f[i]],[ ...

  9. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

随机推荐

  1. 在Android工程中导入外部动态连接库(so文件)

    假设要导入的so文件命为libtest.so,导入的方法如下: 给工程加入Native Support,将libtest.so复制到在jni文件夹下,在Android.mk文件中,加入以下代码: in ...

  2. JNI初识

    JNI:Java Native Interface 的简写,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互. 所谓本地化代码是指直接编译成的与计算机相关的二进制代码,而非Java ...

  3. DropDownlist数据SelectedIndexChanged触发问题解决

    1.设置DropDownlist的AutoPostBack为True 2.绑定DropDownlist数据时出现了重复项, 在载入数据时保存数据状态应该写在Load事件中的if (!IsPostBac ...

  4. 利用外部协议让chrome启动外部应用程序

    http://bbs.kafan.cn/thread-1254526-1-1.html 原理:很简单,标题写的很明确了,不懂的google去. 步骤:举个例子,我要启动D:\Programe file ...

  5. 基于testcontainers的现代化集成测试进阶之路

    大型的软件工程项目除了大量的产品级代码外必不可少的还有大量的自动化测试.自动化测试包含从前端到后端甚至到产品线上不同模块和环境的各种类型的测试.一个比较经典的关于自动化测试分布的理论就是测试金字塔,是 ...

  6. JVM虚拟机的大概了解(新人面试必看!)

    一. 引言,环境安装测试中的代码解析       1. HotSpot(TM) 64-bit Server VM(build 25.181-b13,mixed mode),这是多种     HotSo ...

  7. 教程 | Linux常用命令大全

    Linux常用命令 目录操作命令 ls 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 ls (显示当前目录下文件) ls 目录名 ( ...

  8. 源码分析(一) 进程cleos的命令解析

    EOS版本:4.0   一.进程cleos的作用   cleos,即为client eos.从名字就可以猜出来,它是一个标准的客户端程序,而实际上,它也确实为一个标准的client^_^   准确地说 ...

  9. ldap 报错整理

    1.httpd 无法启动 先用systemctl status httpd 查看一下日志 1.提示端口号是否冲突,修改httpd.conf端口号 2.提示没有权限:检查selinux,防火墙是否关闭或 ...

  10. 使用xadmin覆盖Django的admin

    安装xadmin pip 安装 pip install xadmin  可能会报错 pip install git+git://github.com/sshwsfc/xadmin.git 安装后要使用 ...