首页 > 其他分享 >[学习笔记] ex-KMP

[学习笔记] ex-KMP

时间:2023-10-04 23:23:26浏览次数:35  
标签:匹配段 min 笔记 算法 ex KMP 匹配

简介

exKMP(扩展 KMP 算法),也叫 Z algorithm(Z 算法),可以在 \(\mathcal{O}(|s|+|t|)\) 求解文本串 \(s\) 的所有后缀与匹配串 \(t\) 的最长公共前缀(LCP)。

实现

定义一个长度为 \(n\) 的字符串 \(s\) 的 \(z\) 函数 \(z_i\) 表示 \(s\) 长度为 \(i\) 的后缀与自身的最长公共前缀的长度。一般情况下令 \(z_1 = 0\)。

称 \([i,i + z_i - 1]\) 为 \(i\) 这个位置的匹配段,也可以称作 z-box。根据定义,\(s[i,i + z_i - 1] = s[1,z_i]\)。算法实现中,我们要记录最靠右的匹配段 \([l,r]\),初始 \(l = r = 0\)。

当我们匹配到一个位置 \(i\) 时,需进行分类讨论:

  1. 若 \(i > r\),直接暴力匹配计算 z 函数。
  2. 反之,因为 \(s[1,r - l + 1] = s[l,r]\),所以 \(s[i,r] = s[i - l + 1,r - l + 1]\)。所以先令 \(z_i = \min(r - i + 1,z_{i - l + 1})\),再暴力计算。

复杂度显然线性。

for (int i = 2,l = 0,r = 0;i <= n;i++) {
	z[i] = i > r ? 0 : min(r - i + 1, z[i - l + 1]);
	while (t[1 + z[i]] == t[i + z[i]]) z[i]++;
	if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
}

标签:匹配段,min,笔记,算法,ex,KMP,匹配
From: https://www.cnblogs.com/y1wei/p/exkmp-exkmp-exkmp.html

相关文章

  • [学习笔记] 线性基
    线性基是向量空间的一组基,通常可以解决有关异或的一些题目。——OIWiki线性基就是从初始集合中选出的一个子集,它满足一些性质,可以处理一些问题(屁话)。性质线性基中每个元素二进制下最高位是不同的。线性基中没有异或和为\(0\)的子集。线性基中任意子集中元素异或和的值......
  • [学习笔记] 树链剖分
    叫复习笔记或许更好。树链剖分就是把树剖成链去解决一些问题。定义重子节点:子节点中子树大小最大的节点。轻子节点:除重子节点外的其他子节点。重边:到重子节点的边。轻边:到轻子节点的边。记号\(dfn[x]\):DFS序,也是在线段树中的编号。\(son[x]\):重子节点。\(dep[x]\)......
  • [学习笔记] Tarjan 连通性全家桶
    拜谢陈老师的PPT!!!无向图割点若点\(x\)不为搜索树的根节点,则\(x\)是割点当且仅当搜索树上存在一个\(x\)的子节点\(y\)满足:\(dfn_x\lelow_y\)。特别地,当\(x\)是搜索树的根节点时,则\(x\)是割点当且仅当有两个点\(y_1,y_2\)满足上述条件。割边边\((x,y)\)是......
  • webman:worker exit with status 139(Webman-framework v1.5.7/PHP 8.1.1)
    一,报错信息:worker[webman:225916]exitwithstatus139进程会退出二,解决:禁用opcache模块:在php.ini中注释掉opcache,使它不生效,如下:[opcache];opcache.enable=1;opcache.enable_cli=1;opcache.jit_buffer_size=128M;opcache.jit=tracing;zend_extension=opcache......
  • 笔记——线段树
    蓝月の笔记——线段树篇在树状数组中,我们讲解了关于单点修改区间查询的操作。今天,我们要讲一种更加高级的数据结构,他解决的是区间修改区间查询的问题多了一个区间当然更高级啦。这个数据结构就是——线段树Luogu-P3372给定一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • 活动报名与缴费小程序开发笔记一
    项目背景活动报名与缴费小程序的开发背景主要源于以下几个因素:1.数字化时代的需求:随着移动互联网和智能手机的普及,人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐,而数字化报名与缴费小程序提供了更便捷的解决方案。2.提高效率和减少人力成本:对于活......
  • 流畅的python笔记 (二) 2.序列构成的数组
    内置序列类型分类1:容器序列(能存放不同类型):list,tuple,collections.deque扁平序列(不能存放不同类型):str,bytes,bytearray,memoryview,array.array分类2:可变序列(能被修改):list,bytearray,array.array,collections.deque,memoryview不可变序列:tuple,str,bytes列表推导......
  • ext4文件系统的superblock修复
    操作系统版本[✔️]CentOS7.x/RHEL7.x问题描述ext4文件系统的superblock损坏,利用备份块恢复修复过程检查文件系统fsck.ext4/dev/sdb-a:自动修复文件系统,不询问任何问题-A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统-t<文件系统类型>:指定要......
  • Python笔记
    第一章、Python概述1.1 扩展库安装方法使用pip命令安装扩展库。在cmd命令行中输入pip,回车后可以看到pip命令的使用说明。1.2 常用的pip命令pip命令示例说明pipfreeze[>requirements.txt]列出已安装扩展库及其版本号(不知道怎么用。。?)pipinstallSomePacka......