exkmp略解
推导
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
,并且记此时的i
为a
。
可知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略解的更多相关文章
- io流函数略解(java_input流)[二]
背景 在写这篇随笔之前,已经写了io流函数略解(java_File)(一),主要是总结了File的一些操作,以及一些源码介绍. 在Io实际应用中,实际上运用在如果会操作File,实际上很难写出一点能实 ...
- Android开发之Intent略解
Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...
- iOS中的round/ceil/floorf函数略解
extern float ceilf(float); extern double ceil(double); extern long double ceill(long double); extern ...
- ajax参数设置略解
通过ajax可以直接由页面访问到服务器.做到不刷新页面,就能刷新数据,为开发带来很大的便利. 1.ajax方式的参数及其功能: $.ajax({ type : "POST", // ...
- easyui datagrid 分页略解
easyui datagrid 本身自带了分页功能. 但是这个需要你自己控制. 在后台可以得到两个datagrid的参数,rows 和page.其中rows是每页要显示的个数,page是第几页.单纯的 ...
- Java synchronized同步 各方式略解
近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造).因为在 ...
- android ble蓝牙开发略解
Android 蓝牙4.0开发 1. 权限和相关属性 “android:required="true"表示apk只有在具有bluetooth_le属性的系统里运行,这个4.3之前 ...
- 【Spring-Controller 整理研究】@RequestMapping略解
本文以纯后端的角度,去研究Spring Controller在各种情况的行为,及各种属性的作用. 实验准备 利用https://start.spring.io/快速生成一个开箱即用的小巧spring ...
- 略解ByteBuf
说到ByteBuf,我们并不陌生,官网给的解释为,一个可以进行随机访问或者是顺序访问的字节集合,它是NIO buffers缓冲的底层抽象.既然是底层抽象,那么我们就可以基于其衍生出很多的具体实现出来, ...
随机推荐
- 使用data-自定义数据及如何获取该值
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- mui的ajax例子2
mui.post()方法 前端页面: <!DOCTYPE html><html><head> <meta charset="utf-8"& ...
- JSP注释格式
一.JSP注释格式来源 JSP是Sun Microsystems公司制定的一种服务器端动态网页技术的组件规范,其主体由HTML.CSS.JavaScript和Java拼凑组成. 正是因为JSP是一种组 ...
- Visual Studio 2017 如何打开Model Browser(实体数据模型浏览器)
写一个笔记,记录下在Visual Studio 2017中打开EF模型浏览器的步骤和方法,方便以后忘记了可以重新查阅.主要是现在VS功能越来越多,很多功能模块/界面要开启都是有先决条件,总之隐藏的很深 ...
- python3基础11(正则表达式及re模块)
#生成re对象 compile# 之后再期调用 match search 返回匹配到的字符串# findall 返回匹配结果的列表#如果要对匹配的结果进行分组,可加(),并可通过\数字 去应用
- spark集群配置细则总结
修改目录与目录组: sudo chown -R hadoop:hadoop spark-1.6.1-bin-hadoop2.6 sudo chown -R hadoop:hadoop jdk1.8.0 ...
- SAP云平台运行环境Cloud Foundry和Neo的区别
SAP云平台提供了两套运行环境:Cloud Foundry和Neo 从下图能发现,Cloud Foundry的运行环境,基础设施由第三方公司提供,比如Amazon亚马逊和Microsoft微软,SAP ...
- hdu-1556 Color the ball---树状数组+区间修改单点查询
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目大意: Problem Description N个气球排成一排,从左到右依次编号为1,2 ...
- Linux一键脚本合集vps
首先,想说说一键脚本流行的原因何在? 众所周知的是,Linux 是占据大半壁江山的服务器系统,但在桌面上的占有率可就远不是那么回事儿了,使用和熟悉 Linux 的人远没有 Windows 多,但又因为 ...
- spring-boot自定义启动端口
有时候我们可能需要启动不止一个SpringBoot,而SpringBoot默认的端口号是8080,所以这时候我们就需要修改SpringBoot的默认端口了.修改SpringBoot的默认端口有两种方式 ...