![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
KMP
文章平均质量分 73
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
字符串匹配之KMP算法
以前零零散散做了些KMP的题目,一直也没找出时间整理,这一段又开始研究字符串了,就顺便把KMP整理了一下。废话不说了,我们直接入题。 说到KMP,首先应该知道,它是一种字符串查找算法,因为是由一个姓K,一个姓M和一个姓P的人联合发表的,所以就叫KMP算法了。KMP算法是一种线性时间的的字符串匹配算法,能在O(m+n)的时间数量级上完成字符串的模式匹配操作。它对简单的模式匹配(就是暴力==原创 2015-04-22 17:44:14 · 591 阅读 · 0 评论 -
HDU2203 亲和串 KMP
分析:第一想法就是把字符串s1循环移位一次,然后判断s2是否为移位后的s1的子串,KMP实现的,但是仔细一想这样存在在严重的缺陷,比如字符串s1=“abc”,s2=“abcabcabcabcabc”,理论上,这是符合亲和串的定义的,但我在完全没考虑这种可能的情况下也AC了,这能说明这题的数据量小。KMP实现代码如下:#include #include #include usi原创 2015-05-04 14:36:49 · 428 阅读 · 0 评论 -
hihoCoder1015 KMP算法
题目连接:http://hihocoder.com/problemset/problem/1015分析:找出子串在主串中出现的次数。实现代码如下:#include #include #include using namespace std;int nex[10100];char a[1000010],b[10100];void init_next(){原创 2015-04-27 14:24:13 · 842 阅读 · 0 评论 -
POJ2185 Milking Grid 最小覆盖子矩阵(二维KMP)
题目大意:有一个R×C规模的字符矩阵,求出最小的子矩阵,使该矩阵可以由子矩阵平移得到,输出子矩阵的大小。分析:很明显,符合条件的子矩阵(设该矩阵的规模为w×h)需要同时满足:(1)该子矩阵的h行可以看成h个字符串,原矩阵中任一行字符串都可以由这h个字符串中的一个平铺形成;(2)该子矩阵的w列也可以看成w个字符串,原矩阵中任一列字符串也都可以由这w个字符串中的一个平铺而成;原创 2015-04-24 13:56:08 · 977 阅读 · 1 评论 -
POJ2752 Seek the Name, Seek the Fame KMP-next数组的应用
题目大意:给你一个字符串,让你找出既是前缀同时又是后缀的子串在主串中的位置,如果有多个,按升序输出。分析:考察KMP算法中对next数组的理解。我们知道next[ j ]纪录的是字符串第j个位置之前的next[ j ]个连续的字符和该串的长度为next[ j ]的前缀是相同的。既然如此,要判断一个后缀是否等于前缀,只需看next[ len ]是否等于0即可,next[ len ]!=0原创 2015-04-23 19:21:32 · 356 阅读 · 0 评论 -
POJ2406 Power Strings KMP-next数组的循环节
题目大意:给定一个字符串,让你找出该字符串的最大循环节。分析:next数组的循环节问题。一开始我是暴力next数组的每一个值,找出其中满足循环的最大值,后来发现这样做不可行,因为对于aaaaaab这个字符串来说,他的循环节很明显为1,但aaaaaa这个子串的循环节是6,所以找出整个next数组的最大循环节就出错了。其实我们只需找出next[ len ]这一个值的循环节即可,因为这是个后原创 2015-04-23 20:52:31 · 547 阅读 · 0 评论 -
HDU2087 剪花布条
分析:典型的KMP问题。找出模式串的next数组值,然后遍历主串即可。没成功匹配一次,计数器加一。实现代码如下:#include #include #include using namespace std;int next[1010];char a[1010],b[1010];void init_next(){ int i=0,j=-1; int le原创 2014-09-18 10:15:54 · 403 阅读 · 0 评论 -
HDU1711 Number Sequence
题目大意:给你两个序列a和b,让判断b是否是a的子串,如果是,找出在a中的位置,否则输出-1.分析:裸KMP。实现代码如下:#include #include #include using namespace std;const int MAX=1000010;int next[10010],n,m;int a[MAX],b[10010];void ini原创 2014-09-18 10:00:06 · 415 阅读 · 0 评论 -
HDU3746 Cyclic Nacklace
#include #include #include using namespace std;const int MAX=100010;char str[MAX];int next[MAX];void init_next(){ int i=0,j=-1; int len=strlen(str); next[0]=-1; whi原创 2014-09-17 14:15:42 · 471 阅读 · 0 评论 -
KMP算法next数组的循环节问题
next数组在求解的过程中,用到了KMP的思想,当前失配了,就回溯到上一个next,请见 j=next[j] ,先说个结论,如果到位置 i ,如果有 i%(i-next(i))==0 , 那说明字符串开始循环了,并且循环到 i-1 结束,为什么这样呢?我们先假设到达位置 i-1 的时候,字符串循环了(到i-1完毕),那么如果到第i个字符的时候,失配了,根据next数组的求法,我们是不是得回原创 2014-09-16 14:36:43 · 903 阅读 · 0 评论 -
HDU1358 Period KMP循环节问题
题目大意:给你一个字符串,让你求出从字符串的第2个字符开始,其长度为i的前缀中有多少个循环体大于1的循环节。分析:KMP的next数组循环节问题。遍历字符串中的每一个位置,逐一判断即可。字符串满足next[ i ]!=0&&i%(i-next[ i ])==0时存在循环节,且循环体大小为(i-next[ i ])。#include #include #include us原创 2014-09-16 14:25:15 · 535 阅读 · 0 评论 -
HDU1686 POJ3461 Oulipo KMP算法
题目大意:给你两个字符串,让你求出第一个字符串在第二个字符串中出现多少次。分析:KMP算法,每次匹配成功时让计数器加1即可。实现代码如下:#include #include #include using namespace std;const int MAX=1000010;const int MIN=10010;char T[MAX],W[MIN];int ne原创 2014-09-16 10:38:50 · 684 阅读 · 0 评论 -
HDU2594 Simpsons’ Hidden Talents KMP
题目大意:给出两个字符串s1,s2,长度小于50000,让找出s1最长的前缀,同时该前缀又是s2的后缀,如果存在,输出该前缀和前缀的长度。分析:我们把s1和s2合成一个字符串,求出该模式串的next数组,如果next[ len ]不为0(len为合成的字符串的长度),则即为所求。实现代码如下:#include #include #include #include原创 2015-05-04 21:17:56 · 382 阅读 · 0 评论