推导

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. 从零开始的全栈工程师——js篇2.13(案例存放:三重数组渲染)

  2. Android RecycleView实现混合Item布局

    首先来看看效果吧: 效果预览.png 本实例来自于慕课网的视屏http://www.imooc.com/video/13046,实现步骤可以自己去观看视屏,这里只记录了下实现的代码. 添加依赖: (1 ...

  3. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

  4. 【ros-kinetic iai_kinect2 opencv2 3 】注意事项

    iai_kinect2 :  https://github.com/code-iai/iai_kinect2/tree/master/kinect2_registration kinect2_brid ...

  5. Array负载均衡控制器(vAPV)

    平台: freebsd 类型: 虚拟机镜像 软件包: apache python basic software load balance network infrastructure slb ssl ...

  6. 中标麒麟高级服务器操作系统V6

    平台: linux 类型: 虚拟机镜像 软件包: java-1.6.0 mysql-5.1.5 python-2.6 qt3-3.3.8b basic software linux neokylin ...

  7. Check Point R80 Security Management

    平台: CentOS 类型: 虚拟机镜像 软件包: Security Management basic software security 服务优惠价: 按服务商许可协议 云服务器费用:查看费用 立即 ...

  8. sql优化经典例子

    场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 数据10 ...

  9. LeetCode Length of Last Word 最后一个字的长度

    class Solution { public: int lengthOfLastWord(const char *s) { ; string snew=s; ,len=strlen(s); ]; ) ...

  10. COGS 1944. 背驮式行走

    ★   输入文件:piggyback.in   输出文件:piggyback.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] Bessie和她妹妹Elsie白天都在牧场 ...