假设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. 为一个有数据没有主键id的数据表添加主键字段

    ALTER TABLE `photo_feedbacks` ADD COLUMN `id`  int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KE ...

  2. 【Qt】QSettings介绍【转】

    简介 QSettings类提供了持久的跨平台应用程序设置. 用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表,OS X和iOS的属性列表文件中. ...

  3. 如何去掉html中的超链接

    $a= preg_replace("/<a[^>]+>/", "", $a); $a= preg_replace("/<\/a ...

  4. jQuery实现分页

    转载地址 http://www.cnblogs.com/xiaoruoen/archive/2012/01/11/2318199.html ;( function($){ $.extend({ &qu ...

  5. linux学习之进程,线程和程序

                                                                                      程序.进程和线程的概念 1:程序和进 ...

  6. C++中的struct和class的区别

    C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!stru ...

  7. 在Linux下写一个简单的驱动程序

    本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程.相信这样由浅入深.由具体实例到抽象理论的描述更容易初学者入手Linux ...

  8. iOS中Cell高度如何能够自动适应需要显示的内容

    本文的代码例子 : "Cell行高自适应.zip" http://vdisk.weibo.com/s/Gb9Mt 下面我们来看看代码.我需要一个第三方库EGO异步下载.addtio ...

  9. google api , the problem of null refresh token

    http://stackoverflow.com/questions/10827920/google-oauth-refresh-token-is-not-being-received The ref ...

  10. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...