推导

ext[i]表示母串s[i..lens]和子串t[1..lent]的最长公共前缀。

nxt[i]表示t[i..lent]t[1..lent]的最长公共前缀。

假设ext[1..k]已经算好,现在想求ext[k]

我们先找出1..k中,i+ext[i]-1的最大值p,并且记此时的ia

可知s[a..p]=t[1..p-a+1],自然有s[k+1..p]=t[k-a+2..p-a+1],记l=nxt[k-a+2]

出现两种情况:

  • k+l<p

    可想而知,ext[k+1]=l
  • k+l>=p

    这样会发现有未知情况,因此就再度匹配,直至适配,然后更新a
int lena, lenb, nxt[100005], ext[100005];
char a[100005], b[100005];
void mknxt(){
int j=0, po;
nxt[0] = lenb;
while(j+1<lenb && b[j]==b[j+1]) j++;
nxt[1] = j;
po = 1;
for(int i=2; i<len; i++){
if(i+nxt[i-po]<nxt[po]+po)
nxt[i] = nxt[i-po];
else{
j = max(nxt[po] + po - i, 0);
while(i+j<lenb && b[i+j]==b[j]) j++;
nxt[i] = j;
po = i;
}
}
}
void exkmp(){
int j=0, po;
while(a[j]==b[j] && j<lena && j<lenb)
j++;
ext[0] = j;
po = 0;
for(int i=1; i<lena; i++){
if(nxt[i-po]+i<ext[po]+po)
ex[i] = nxt[i-po];
else{
j = max(ex[po] + po - i, 0);
while(i+j<lena && j<lenb && a[i+j]==b[j]) j++;
ext[i] = j;
po = i;
}
}
}

exkmp略解的更多相关文章

  1. io流函数略解(java_input流)[二]

    背景 在写这篇随笔之前,已经写了io流函数略解(java_File)(一),主要是总结了File的一些操作,以及一些源码介绍. 在Io实际应用中,实际上运用在如果会操作File,实际上很难写出一点能实 ...

  2. Android开发之Intent略解

    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...

  3. iOS中的round/ceil/floorf函数略解

    extern float ceilf(float); extern double ceil(double); extern long double ceill(long double); extern ...

  4. ajax参数设置略解

    通过ajax可以直接由页面访问到服务器.做到不刷新页面,就能刷新数据,为开发带来很大的便利. 1.ajax方式的参数及其功能: $.ajax({ type : "POST", // ...

  5. easyui datagrid 分页略解

    easyui datagrid 本身自带了分页功能. 但是这个需要你自己控制. 在后台可以得到两个datagrid的参数,rows 和page.其中rows是每页要显示的个数,page是第几页.单纯的 ...

  6. Java synchronized同步 各方式略解

    近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造).因为在 ...

  7. android ble蓝牙开发略解

    Android 蓝牙4.0开发 1.  权限和相关属性 “android:required="true"表示apk只有在具有bluetooth_le属性的系统里运行,这个4.3之前 ...

  8. 【Spring-Controller 整理研究】@RequestMapping略解

    本文以纯后端的角度,去研究Spring Controller在各种情况的行为,及各种属性的作用. 实验准备 利用https://start.spring.io/快速生成一个开箱即用的小巧spring ...

  9. 略解ByteBuf

    说到ByteBuf,我们并不陌生,官网给的解释为,一个可以进行随机访问或者是顺序访问的字节集合,它是NIO buffers缓冲的底层抽象.既然是底层抽象,那么我们就可以基于其衍生出很多的具体实现出来, ...

随机推荐

  1. SVG矢量图【转】

    var iconArray=[ //'circle', //实心圆 //'rect', //矩形 //'roundRect', //圆角矩形 //'triangle', //三角形 //'diamon ...

  2. n宫格的实现方法

    方法一.table 1.看成多列 <style> .line{ display: table; width: 1024px; clear:both; overflow:auto; /*-- ...

  3. Git命令--保存用户名和密码

    使用git各项操作时,总是会出现输入密码的弹窗,且需要多次输入,很是繁琐,通过git命令可以记住密码,避免多次操作. 一.创建保存密码的文件 1.在home文件夹,一般是 C:\Documents a ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在<迷你微信>服务器中,我们用了Log4J来进行输出,这可以在我们程序出现异常的时候找到错误发生时 ...

  5. 【ros】【bug】gtk2\3 冲突

    ORBSLAM2首次运行出现GTK冲突. Gtk-ERROR **: GTK+ 3 symbols detected. Using GTK+ 2.x and GTK+ 3 in the same pr ...

  6. nc扫描端口

    nc -n -v -z -w 1 ip地址 1-1000 (端口号) 详细信息 -v 排除dns  -n 不发送任何数据-z 超时设置为1秒 -w 1

  7. SQLServer从其他表获取的数据更新该表的一部分

    在网上常见的是update  a  set  username  =  username  FROM b  on a.userid=b.userid,该更新语句是对a表中所有行进行更新.如果只更新一部 ...

  8. hbase查询语法

    1.scan '表名',{FILTER=>"PrefixFilter('rowkey值')"} scan 'useractions',{FILTER=>"Pr ...

  9. 初学基础python记录

    1.对于python来说,最重要的就是缩进.相当于其他语言的{}中括号. 2.转义快捷等 alt+p和alt+n来复制上下一行.变量使用时得先赋值,且大小写敏感,遵循变量命名规则.Python还允许用 ...

  10. LeetCode Reverse Bits 反置位值

    题意:给定一个无符号32位整数,将其二进制形式左右反置,再以整型返回. 思路:循环32轮,将n往右挤出一位就补到ans的尾巴上. class Solution { public: uint32_t r ...