扩展kmp                 LRH

所谓扩展kmp指的是与kmp相似的求辅助数组的原理,但是本身与kmp关系不大。

1.exkmp的用途:给定一个主串s和一个子串t,求出s中每一个后缀和子串t的最长公共前缀。

2.算法推导:

给定一个主串:S=aaaaaaaaaabaaa

 T=aaaaaaaaaaa

(下标都是从零开始!!!)

                 第一步

需要有两个辅助数组:extand[i]和next[i];

extand[i]:表示主串S以i开始的后缀与子串T的最长公共前缀。

next[i]:表示子串T中以i开始的后缀与子串本身的最长公共前缀。

首先看这个样例,很显然extend[1]=10。然后要求extend[2]。如果暴力求的话还要再用每个字符比较一遍太过麻烦。那么已经求得的extend[1]是不是可以利用呢?

通过求得的extend[1]我们已经知道了:S[1...10]=T[1…10](不知道为什么的看定义去)。那么S[2..10]=T[2…10]。再算extend[2]时很明显extand[1]是没有用的,所以要从S[2]匹配。于是我们就要再引入一个数组next[i]。根据定义:

因为next[2]=9;

所以T[211]=T[110]

所以T[210]=T[19](都删去一个字符)

所以T[19]=S[210]

所以extand[2]就等于9啊!!!多么神奇啊!

第二步

求完extand[2]后就可以知道这种求法原理是一种递推的。那么下面我们抛开特殊来看一般

我们假设extand[1…k]已经求好(就像刚刚那个extand[1]已经求好一样)。并且,在以前匹配过程中在S当中所匹配到的最远位置是p那么这个最远的位置是不是就是i+extand[i]-1?(当前位置+匹配长度-1=匹配到的末端位置),其中i=1…k。不妨取这个最远的位置所对应的i是a很显然这个a是比p要小的。那么根据定义就可以推出           S[ap]=T[1p-a+1];

所以 S[k+1p]=T[k+a+2p-a+1](都删去一段字符)

我们再定义一个L,另L= extand[k-a+2](注意:这是定义的,不要老是纠结他究竟是为了什么,不然会很痛苦!!!这个会用到的。)

那么根据L就可以推导出:T[1L]=T[k-a+2k+L-a+1]

相信看到这里大多数人都已经懵逼了,那我们还是先回想一下next数组的定义,然后画个图就能懂了:

是不是已经懂了?这是next数组的一个性质,前面在推extand[2]的时候应经用了。

第三步

现在就出现了两种情况:

(一) k+L<p

图中红色的区域一定是相等的,即S[k+1k+1+L]=T[1L]

因为前面已经推导过T[1L]=T[k-a+2k+L-a+1](1)

并且S[k+1p]=T[k+a+2p-a+1](2)   p>k+L

所以(1)式的右端点在(2)式右端点的左边。

所以 多出来的那块=(p-a+1)-(k+L-a+1)

再用p-[(p-a+1)-(k+L-a+1)]+1=k+L+1!

所以就推出了S[k+1k+L+1]=T[1L]

那么就可以知道蓝色的部分一定不会相等(因为L=extend[k-a+2]呀,如果相等的话那extend[k-a+2]不就等于L+1甚至更大了吗?)

为什么k+L不能=p?  因为小于p时p之前一定存在一个字符与T[L+1]不匹配(图中蓝色区域)。如果等于p,那就无法判断下一位是否不匹配了。

所以我们就得出了extend[k+1]=L,就求出来了!

(二) k+L>=p

明白了第一种,这种情况就比较通俗易懂啦!

上图的紫色部分是未知的,红色部分是已经匹配的。因为在计算extend[1…k]时达到的最远位置是p,所以p之后的的位置无法访问。那怎么办?问我??这还用说:暴力求啊!

从S[p+1]和T[p-k+1]开始匹配不就完啦?之后更新extend[a]+a和extend[k+1]+k+1的大小,后者的就更新最远位置p然后,,,就没有然后了!!!!

那么next数组怎么求呢?其实next数组就是一个以T为主串,T为字串的一个特殊的扩展kmp!用上文介绍的相同算法计算next数组即可。

唉!这就完了。写了整整一个晚上,因为下午刚学,连推公式带迷茫的痛苦了三个小时,终于完成了再附一个代码:

Return 0!!!!!

谁都曾面对生活痛苦犹疑,谁都会有不上台面的时光,那一点也不丢人。别人的生活没有你想像的好,你的生活也没有自己以为的坏。你的伤痕甚至都不能比别人更独特。 重要的是,生命中发生的每一件事情都自有意义,每一次的历经都应使我们变成更好的人,千万不要做一个白白吃过了上天给过的苦头之后却并不去领通关礼物的人。 不要太过聪明地去总结受伤害的经验,伤害你的人已经走远,为你的旧伤口买单的人是无辜的后来人,并且往往是靠近你想要温暖你的人。有时候,放下“聪明”,我们才能在幸福的路上走得更远。 你可以躲起来疗伤,但不要躲得太久,你为旧伤口浪费的是你本可以用来幸福的时光。不要总说你还没有准备好,不要总把期待留给明天,我们生命里没有那么多明天可以等,每一个今天都是你昨日曾期待的明天。爱,快乐,倾听自己的内心,都是要趁今天的事情。只有能将当下过好的人,才可能真的拥有一个好明天。 若不是生命里那些曾经拥有又失去,我们大概一生也不会弄懂生活。 那种被生活伤害过、灰心失望过,却依然坚信美好并不断去抵达的笃定,才是这世间真正堪称力量的东西。那种从平淡生活里扎根生出的力量,才是能傲视风雨的力量。 笃定的面容是这世间最美的面容。亲爱的你啊,一定要成为更幸福的人!

扩展KMP——算法总结,来自于 迷路的鸽子的更多相关文章

  1. 扩展KMP算法小记

    参考来自<拓展kmp算法总结>:http://blog.csdn.net/dyx404514/article/details/41831947 扩展KMP解决的问题: 定义母串S和子串T, ...

  2. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  3. 神奇的字符串匹配:扩展KMP算法

    引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...

  4. (模板)扩展kmp算法(luoguP5410)

    题目链接:https://www.luogu.org/problem/P5410 题意:有两个字符串a,b,要求输出b与a的每一个后缀的最长公共前缀.输出: 第一行有lenb个数,为b的next数组( ...

  5. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一   ...

  6. KMP算法模板&&扩展

    很不错的学习链接:https://blog.csdn.net/v_july_v/article/details/7041827 具体思路就看上面的链接就行了,这里只放几个常用的模板 问题描述: 给出字 ...

  7. HDU3613 Best Reward —— Manacher算法 / 扩展KMP + 枚举

    题目链接:https://vjudge.net/problem/HDU-3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  8. 初探KMP算法

            数据结构上老师也没讲这个,平常ACM比赛时我也没怎么理解,只是背会了代码--前天在博客园上看见了一篇介绍KMP的,不经意间就勾起了我的回忆,写下来吧,记得更牢. 一.理论准备      ...

  9. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

随机推荐

  1. ASP.NET Zero--9.一个例子(2)商品分类管理-列表

    1.创建实体类 参考:http://www.cnblogs.com/farb/p/4923137.html 在Core(领域层)项目下新建一个目录Entities,在此目录下新建一个Category类 ...

  2. 用C++实现的八皇后问题

    我是一个C++初学者,控制台实现了一个八皇后问题. 代码如下: //"八皇后问题"V1.0 //李国良于2017年1月11日编写完成 #include <iostream&g ...

  3. ViewCompat.animate(view) floatEval.evaluate() argbEval.evaluate()

    ViewCompat.animate(ivHead) .translationX(60)// .setInterpolator(new CycleInterpolator(4))//循环执行// .s ...

  4. CentOS7安装完毕,重新开机启动后显示: Initial setup of CentOS Linux 7 (core)

    CentOS7安装完毕,重新开机启动后显示: Initial setup of CentOS Linux 7 (core) 1) [x] Creat user 2) [!] License infor ...

  5. LaTeXの学习笔记

    听说LaTeX挺有趣,决定学习一下提升自己的境(逼)界(格),借鉴了许多大神的经验与笔记,希望能坚持下去......(* ̄;( ̄ *) 1.论文写作的三种格式 eg. \documentclass{a ...

  6. 关于++i和i++

    这个东西我忘了好几次了,啊啊啊,难道是没真正理解吗<script> window.onload=function(){ var i=0; var a=++i; alert(a); }< ...

  7. jQ内容的强大,后面继续跟进...

    <script type="text/javascript" src="jQ/jquery.js"></script> <scri ...

  8. Beego学习笔记——Logs

    日志处理 这是一个用来处理日志的库,它的设计思路来自于database/sql,目前支持的引擎有file.console.net.smtp,可以通过如下方式进行安装: go get github.co ...

  9. html5 拖拽文件到页面实现上传

    思路:监听拖拽区域的 drop 事件,阻止浏览器上的默认拖拽事件 参考:http://www.helloweba.com/view-blog-192.html 例子: <!DOCTYPE htm ...

  10. glibc漏洞监测并修复

    [CVE 2015-0235: GNU glibc gethostbyname 缓冲区溢出漏洞 ]全面爆发,该漏洞的产生是Qualys公司在进行内部代码审核时,发现了一个在GNU C库(glibc)中 ...