假设s1里找s2,
然后s2进去匹配
假设在第三位失配
那么说明前两位是匹配成功的
如果这时候将s2后移一位相当于将s2的第一位和s2的第二位比较,如果我们已知s1(1)≠s1(2)那么就可以直接后移两位
而这时候就是s1(1)和s1(3)比较,如果s1.1=s1.3那就可以直接后移3位了
我们的目标就变成了在s1里找到一个递推式满足f(i)
i表示在第i位失配后移的位数
现在要找递推方法,假设f(i)已知现在由f(i)推出f(i+1)
假设f(i)=k,现在假设失配位是k,我们要做的就是找到一个最大的m满足 s1[0],s1[1]....s1[m-1]  ==  s1[k-m],s1[k-m+1]...s1[k-1]
回到刚刚的我们假设f [i] = k,那么f [i+1]有3种情况:
①s1[k+1] == s1[i+1] —>f[i+1]=k+1
②如果s1[k+1] != s1[i+1] —>问题就变成了在前k个里找一个最大的s使得s1[0],s1[1]...s1[s] == s1[k+1-s], s1[k-s] ...s1[k+1]
这个s是已知的,就是f[k+1]
③f[k+1] <=0 —>f[j+1] = 0
 
That is over.
 
 
 
 
 
 

看到一个推荐的blog讲的超详细我这么蒻都看懂了七七八八
http://www.matrix67.com/blog/archives/115
mark一下√
 
 

 
//我们要在a串中找b串出现的次数 b串叫做模式串,a串叫做匹配串
考虑暴力匹配的时候在匹配串枚举模式串的开头在哪里,一位一位比较是不是相同,不相同的话就把开头往下移以为继续判断
假设模式串匹配了1~j位,在j+1位和匹配串发生了冲突,这时候要在匹配串重新设置开头从哪一位开始匹配。
/*
  比如原先是i开头,就比较i~i+j-1位,然后这i~i+j-1位都是相同的,但是在i+j位它会变成不同的
  这时候如果暴力移动指针的话,如果发现从i+1到i+j-1中有一段和i开始到i+j-1位中间有一段是相同的话,那就可以把中间那段替换过去
*/
//其实就是不匹配的那个的前面X位还是后面X位有匹配串的开头资磁的XX位就移到X位去
//这样时间复杂度就低啦
 
 
 
 
 
 
 
 

 
 
//hzwer说这玩意儿NOIP不考,省选考,标记一下
 

 
 突然发现的blog感觉排版什么的很资磁
https://blog.sengxian.com/algorithms/kmp#main
 
 
 
 
 
 
 
 
 
 

KMP笔记√//找最大子串,前缀自匹配长度的更多相关文章

  1. KMP小扩展,找出子串在主串中出现的所有位置

    KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所 ...

  2. KMP算法 - 求最小覆盖子串

    KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...

  3. 字符串(后缀数组):HAOI2016 找相同子串

    [HAOI2016]找相同子串 [题目描述] 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. [输入格式] 两行,两个字符 ...

  4. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...

  5. ArcGIS案例学习笔记-找出最近距离的垂线

    ArcGIS案例学习笔记-找出最近距离的垂线 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于任意矢量要素类,查找最近距离并做图 数据: 方法: 0. 计算 ...

  6. 项目发布之后 总提示有一个.DLL找不到或不匹配

    最近发布项目(.net,winform)总提示有一个.dll文件找不到或者不匹配 但是在本地调试是正常的 这个.dll,原来是从.net组件中引用到项目的,后来我将此.dll文件从网上下载,然后在项目 ...

  7. [HAOI2016]找相同子串

    这题感觉有点坑啊. 题目还是不难想的,先对一个字符串建后缀自动机,然后拿另一个字符串在上面跑. 假设当前跑到了p点,匹配长度为len. 那么当前会对答案产生贡献的串是哪些呢? 显然当前会对p及p到根的 ...

  8. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  9. poj3261 后缀数组求重复k次可重叠的子串的最长长度

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13669   Accepted: 6041 Ca ...

随机推荐

  1. iTerm2 颜色配置

    1. 首先找到配色文件: iterm2官网配色方案iTerm2-Color-Schemes altercation的  solarized配色方案solarized 2. 配置步骤: clone上面的 ...

  2. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

  3. Thinkphp整合最新Ueditor编辑器

    说到最新的富文本编辑器的确不少(ckeditor.fkeditor.ueditor),这些富文本编辑器如果单独使用基本上很方便,不需要做额外的配置,只要把官方的插件下载下来放到一个web容器中,看看 ...

  4. C#中Delegate

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. js实现复制到剪切板

    // <![CDATA[ function copy_clip(copy) { if (window.clipboardData) { window.clipboardData.setData( ...

  6. Oracle 动态视图3 V$SESSION

    每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,LGWR,arcchiver等 Column Datatype Description SADDR ...

  7. javascript 柯里化

    先看一下代码 function add(){ var sum=0; for(var i=0;i<arguments.length;i++){ sum+=arguments[i]; } retur ...

  8. 在Windows 上安装SQL Server的一些注意事项

    基本来说安装SQL Server 单节点数据库并不是很困难的事情,大多可以通过Next来安装完成.其中要注意以下几点 安装.net3.5 可以参考本Blog的一些安装须知. Windows Serve ...

  9. DRP中用到的JavaScript验证

    在Drp中添加按钮的时候要验证用户输入的是否合法利用JavaScript就可以实现这个功能下面就是我的代码. <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  10. Redis集群明细文档

    Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式).目前根据文档已经看到Redis正在开发集群功能,其中一 ...