Z算法(EXKMP)

扩展KMP(exkmp) exkmpexkmpexkmp 求解的问题:对于给定的主串 SSS ,和模式串 TTT ,求出主串 SSS 的所有后缀与模式串 TTT 的最长公共前缀长度。 KMPKMPKMP 求解的问题是在主串 SSS 中模式串T出现的次数和位置,扩展KMP扩展KMP扩展KMP 求解问题包含了 KMPKMPKMP 求解的问题,因为主串 SSS 中与模式串 TTT 的最长公共前缀长度等于 ∣T∣|T|∣T∣ 的后... 阅读详情

Z算法(EXKMP)

爆肝计划

刚开始接触时,疑惑于Z算法和EXKMP,二者的作用基本相似,我就想,既然起了不一样的名字,那么他们的解题思路必然不一样吧。

我又经过了网上大量收集资料,发现有的大佬是两个和一块成一个感念,有的是单独讲一个,这让我小蒟蒻很为难,最后在大佬的指路下去了去了OI WIKI,然后知道他俩是合在一块的,连接再此。

但是EXKMP多了next数组,为了方便,在这里就开始讲z算法吧

1.首先我们要明白z算法是一种用于字符串区配的算法,是对字符串S,O(n)地求出S的全体后缀与S自身的最长公共前缀的长度,记录在数组z[]中(z[i]即后缀 i与S的最长公共前缀的长度)。

2.话不多说,上图(字丑,见谅)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上面我们可以得到这么规律

1.假设i>R,则说明不存在一个结束于i或者i之后的串,同时这个串本身也为s的一个前缀,否则R不应该小于i。对于这种情况,需要重新计算新的L与R,令L=R=i,暴力比较s与suffix(i),得到z[i]=R-i+1=R-L+1。

2.此时i<=R,令k=i-L,可以断言z[i]>=min(z[k],R-i+1)。因为根据L与R的含义,此时我们可以将L到R视作为字符串的前缀,那么i相对于L的偏移量为k。

如果z[k]<R-i+1,则z[i]必然等于z[k],基于此时,s[k,k+z[k]-1]是s[i,R]的一个前缀,同时在这种情况下L与R不变。

如果z[k]>=R-i+1,根据R的含义可知s[R+1]!=s[R-L+1],z[k]中大于R-i+1的匹配信息因为s[R+1]!=s[R-L+1]而无效,但这并不意味着s[R+1]!=s[R-i+1],此时根据z[k]可以断言z[i]至少是R-i+1,是否可以更大需要再进行计算,令L=i,更新R值,并得到此时的z[i]。

目前并没有什么只用这算法的例题,那么先把模板代码贴上把,能够实现求z数组


void z_init(){//求z数组
    z[1]=n;//特殊处理z[1]
    int zl=0,zr=0;//右端点最大
    for(int i=2;i<=n;i++)//从i=2递推到i=n
        if(zr<i){//第1种情况
            z[i]=0;
            while(i+z[i]<=n&&a[i+z[i]]==a[1+z[i]])z[i]++;//直接向后暴力匹配
            if(z[i])zl=i,zr=i+z[i]-1;//更新右端点
        }
        else if(i+z[i-zl+1]<=zr)z[i]=z[i-zl+1];//第2种情况的第1种情况
        else{//第2种情况的第1种情况
            z[i]=zr-i+1;//z[i]至少有zr-i+1
            while(i+z[i]<=n&&a[i+z[i]]==a[1+z[i]])z[i]++;//后面再暴力匹配
            zl=i;zr=i+z[i]-1;//更新右端点
        }
}

欢迎留言哟ヾ(≧▽≦*)o

【python基础】一文掌握 Jupyter Notebook 的使用(超级详细!) 是一个非营利组织,致力于为多种编程语言的交互式计算开发开源软件、开放标准和服务。Jupyter 于 2014 年由 Fernando Pérez 从IPython衍生出来,支持几十种编程语言的执行环境。Jupyter 项目主要开发并支持(.ipynb 文件格式)、JupyterHub和JupyterLab等交互式计算产品。 阅读详情

相关推荐

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 409

ExKMP(Z Algorithm) 讲解

目录 问题引入 CaiOJ 1461 【EXKMP】最长共同前缀长度 算法讲解 匹配过程 next 的求解 复杂度证明 代码解决 一些例题 UOJ #5. 【NOI2014】动物园 ...

weixin_30522095的博客 735

微信H5网页授权通用方案:中转页破解域名限制,适配Hash/History路由

在Web开发中,OAuth 2.0授权码模式是实现第三方登录的通用标准,其核心原理是通过授权服务器颁发临时代码,再由客户端交换访问令牌。这一机制在微信公众号H5开发中尤为重要,用于安全获取用户身份。然而,微信平台对网页授权回调域名有严格的数量限制,这成为多子域名、多环境及微前端架构下业务扩展的主要瓶颈。其技术价值在于通过设计一个统一的中转授权页,将授权逻辑与业务逻辑解耦,让所有业务页面共享一个已配置的授权入口,从而突破域名配额限制。该方案的关键在于适配不同的前端路由模式,需精准处理Hash模式与Histor

weixin_42533120的博客 318

【学习笔记】exkmp(Z函数)

exkmp 和 kmp 要求的东西比较类似。exkmp 可以求出aina_{i...n}ai...n​和bbb的最长公共前缀。这玩意也称 z 函数。

Brute♂force 1104

用ESP32-S3+OV2640摄像头+ILI9488屏,DIY一个能联网的智能猫眼(附完整代码)

本文详细介绍了如何利用ESP32-S3微控制器搭配OV2640摄像头和ILI9488显示屏,DIY一个功能强大的智能猫眼系统。从硬件选型、电路设计到软件开发,提供了完整的解决方案和优化技巧,包括图像采集显示、WiFi远程访问及低功耗设计,适合智能家居爱好者动手实践。

weixin_30897233的博客 501

CUDA详细安装及环境配置——环境配置指南 – CUDA+cuDNN+PyTorch 安装

本文详细介绍了如何确定显卡支持的CUDA版本、选择对应的cuDNN版本,并逐步安装CUDA、cuDNN和PyTorch。首先,通过命令行输入nvidia-smi.exe查看显卡支持的CUDA版本。接着,根据CUDA版本选择对应的cuDNN版本并下载。然后,从NVIDIA官方网站下载CUDA安装包,按照提示进行安装,并检查是否安装成功。同样地,下载cuDNN安装包,解压后将文件拷贝到CUDA安装目录中,并通过命令行验证安装是否成功。最后,根据PyTorch官网的指引,选择合适的安装命令进行PyTorch的安装

2501_90350274的博客 5098

EXKMP学习笔记QAQ

因为一本通少了一些算法,所以我就自行补充了一些东西上去。 EXKMP也就是扩展KMP,是一种特别毒瘤的东西 今天学习笔记将会换个方式,以前是边学边写,由于EXKMP有点难理解QAQ,所以决定自行理解一波。 伪目录自己推都有目录? 定义 算法思想 练习题目 定义 例题 EXKMP就是解决这种问题的。 先讲两个数组的定义(默认所有数组从1开始): ex数组,代表A(模式串)的从第i位与B(子串)的...

蒟蒻QMQ 463

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

exkmp

exkmp http://acm.hdu.edu.cn/showproblem.php?pid=2328 求nnn个串的最长公共子串lcslcslcs 考虑用最短的串作为TTT串,然后枚举TTT的所有后缀,与所有其他串进行exkmpexkmpexkmp,每次找到最大值,然后整体取最小即可。 时间复杂度:O(n∣s∣2)O(n|s|^2)O(n∣s∣2) 求一个串的前缀等于另一个串的后缀 最大长度。 exkmp的完全匹配,更新mx值要注意完全匹配后缀。 int mx=0; for(int i=0;i&lt

Harris-H的博客 699

极简JEPA世界模型实战:低门槛复现LeWorldModel,CPU可跑

这次我们来看一个能让普通开发者真正上手跑起来的“世界模型”项目。如果你对Yann LeCun提出的JEPA(联合嵌入预测架构)框架感兴趣,但又苦于Meta官方实现过于庞大复杂,那么这个GitHub上4k star的项目就是为你准备的。它用极简的PyTorch代码(核心文件仅160-278行)完整复刻了包括LeWorldModel在内的五个JEPA核心变体,最大的亮点是: 门槛极低,普通笔记本甚至CPU就能跑,显存占用友好,非常适合学习和原理验证。 这个项目名为 keon/jepa ,完全开源。它剥离了工业级

weixin_29031161的博客 421

Apollo Control——超详细入门教程(六):MPC二次规划问题转化

专栏文章列表 Apollo Control——超详细入门教程(一):基于道路误差的车辆动力学模型 Apollo Control——超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导 Apollo Control——超详细入门教程(三):基于Frenet坐标系及XY坐标系的多项式轨迹生成 Apollo Control——超详细入门教程(四):控制模块轨迹误差计算 Apollo Control——超详细入门教程(五):油门刹车标定表之双线性插值算法 ...

凉了鸭的博客 2233

KMP+Z算法(exkmp)(板子)

适合有KMP基础的读者阅读

Mango. 409

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 673

exKMP(扩展KMP)

扩展KMP又称Z函数,可以快速的求出一个字符串的每一个后缀的与其的LCP(最大公共前缀)长度。至于为什么要学习exKMP,因为()我们都是上进的OIer。 exKMP的时间复杂度虽然我们看似进行了很多次的朴素方法,但是我们使用暴力求法时都是$i+z[i-l] \ge r$或$i \gt r$的时候,而且我们的$r$是不断向后变化的(不变化就一定是$O(1)$的解法),也就是说实际上我们只对$S[]$(也就是代码中的$b[]$)只遍历了一次(对于整个exKMP来说,下同),而外围循环求$z$也只会遍历一次$z

binbin_12345的博客 541

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【luogu P5410】【模板】扩展 KMP(Z 函数)(字符串)

给你一个字符串,要你求它每个后缀跟它 LCP 的长度。(Z 函数) 给你两个字符串,要你求一个字符串每个后缀跟另一个字符串 LCP 的长度。(exKMP)

欢迎您的光顾awa 229

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

KMP / EXKMP

KMP 、 拓展KMP (Z算法)

PURSUE__LIFE的博客 400

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NOIP 备赛指南 (2):字符串匹配(KMP)

本文介绍了KMP算法及其扩展应用。主要内容包括: KMP算法通过预处理模式串生成next数组,利用已匹配信息避免回溯,将字符串匹配优化至线性时间复杂度O(n+m)。文章提供了KMP模板代码实现。 扩展KMP(Z函数)用于求解模式串与文本串每个后缀的最长公共前缀,给出了算法定义和实现模板。 简要提及马拉车(Manacher)算法(未详细展开)并附模板代码。 通过经典例题展示KMP应用,如利用lps数组性质求解无线传输问题的最短循环节长度。 文章涵盖字符串匹配基础概念(前缀/后缀/Border)、多种算法实现及

joe_g12345的博客 247

Manacher与exKMP(扩展KMP,Z函数)

Manacher 由 Glenn K. Manacher 在 1975 年提出,能够 O(n) 求出一个字符串的最长回文串长度与每个点为对称中心时最长回文串长度;Z 函数,又称扩展 KMP (exkmp),可以 O(n) 求出一个字符串的所有后缀与这个字符串的 LCP 长度……

CE_Automata的博客 1248

字符串学习笔记1

本文介绍了三种高效字符串处理算法:Manacher算法(线性时间求解最长回文子串,通过插入分隔符统一奇偶情况)、Z算法(线性时间计算所有后缀与模式串的最长公共前缀)和最小表示法(线性时间找到字典序最小的循环同构串)。文章包含算法原理、正确性证明、代码实现及例题解析(如国家集训队题目P1659、P4555和CF526D),强调独立完成习题的重要性,并预告后续将讲解自动机相关算法。三种算法的核心思想均是利用对称性或已有信息避免重复计算,实现O(n)时间复杂度。

yuyancheng28的博客 475

「学习笔记」字符串大礼包

备忘,讲讲思想 KMP f[i]表示1到i最长的后缀等于前缀。容易证得每次f最多+1,然后复杂度就是O(n)的。匹配当成拼接在原串后面继续计算f数组。 EXKMP z[i]表示i开始的最长的等于原串前缀的长度。暴力扩展是O(n^2)的,每次记录一个最右的等于某前缀的串[l, r],i<=r就从min(r - i + 1, z[i - l + 1])开始扩展,否则从0开始。能证每次扩...

weixin_30487701的博客 136

复健打卡第一天

拓展kmp

weixin_60471968的博客 565

KMP和EXKMP(Z函数)

useful or useless?

R的博客 372

Distinct Substrings(2019年湖南acm第三题)

题目的意思是:给一串数字,然后在后面添加一个数字x问你新增了多少子串h[x],求这个数字x取从1到m时 3x*h[x]%mod的异或和。 思路:考虑新添加一个数字,增加的子串的数量为所有以该数字结尾的后缀,但是会出现前面已经出现过的子串,所以我们需要算出在没有添加之前出现过多少以该数字结尾的字符串,考虑将这些数反过来,然后用exkmp求出,next[i]: T[i~n-1]和T的最长公共前缀;对于1~m的每一个数字,我们只要求出其最大值即可,然后n-最大值就是这个数字的答案,将所有的答案异或就是最后的..

write_wish的博客 204

字符串覆盖问题

那么,我们可以使用并查集来帮助我们将线段树的。

既然弱小,就只顾变强就是了 875

P5410 【模板】扩展 KMP/exKMP(Z 函数)

给定两个字符串abbzzbbbap对于一个长度为n的数组a,设其权值为xori1n​i×ai​1。

m0_61360607的博客 1201

kmp与exkmp算法

做法就是将字符串反转之后拼接,中间用#隔断,输出后段字符串里面最大的next就行。或者把两个字符串拼接,小的在前大的在后,中间用其他字符隔断。答案就是n-next[n]

cuiyyu的博客 303
上一篇: Manacher算法
下一篇: Hash 算法(A - Crazy Search)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值