假设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. http 错误编号大全(转)

      状态行包含HTTP版本.状态代码.与状态代码对应的简短说明信息.在大多数情况下,除了Content-Type之外的所有应答头都是可选的.但Content-Type是必需的,它描述的是后面文档的MI ...

  2. DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了. 一.GlobVar.pas单元,定义应用系统全局数据类型及变量: unit GlobVar; interface uses System ...

  3. python之递归

    递归的定义:即对自己自身内容的引用. 有用的递归函数应包含以下几步份: 当函数直接返回值时有基本的实例(最小可能性问题): 递归实例,包括一个或者多个问题较小部分的递归调用: 递归的关键就是将问题分解 ...

  4. 安装360后,visual studio 经常报各种莫名其妙的错误的解决方案

    安装360后,visual studio  经常报各种莫名其妙的错误,每次都要查找错误的解决方案 而且网上关于这个的好少,以后只要碰到了这种情况我就记录下吧 今天碰到的情况是打开WCF服务时出现   ...

  5. WPF之UseLayoutRounding和SnapsToDevicePixels

    最近在工作中看别的朋友XML代码时,发现SnapsToDevicePixels 属性然后通过查询资料了解其作用 1)UserLayoutRounding为False,导致控件布局相对屏幕若不是整数则不 ...

  6. Java从入门到精通——数据库篇之OJDBC版本区别

    classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle  ...

  7. php中使用linux命令四大步骤

    一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个):P ...

  8. spring中Bean的注入参数详解

    字面值    一般指可用字符串表示的值,这些值可以通过<value>元素标签进行注入.在默认情况下,基本数据类型及其封装类.String等类型都可以采取字面值注入的方式,Spring容器在 ...

  9. php Linux安装

    参考地址:http://www.cnblogs.com/lianyue/p/3936728.html

  10. webview加载本地html

    //webView.loadUrl("file:///android_asset/index.html"); 加载assets目录中含有的index.html  webView.l ...