首页 > 编程语言 >【学习笔记】KMP 相关算法

【学习笔记】KMP 相关算法

时间:2024-01-10 10:15:36浏览次数:30  
标签:le gcd dfrac 笔记 算法 KMP 周期 mathrm

KMP

单模式串匹配,比较平凡所以不说了,比较有借鉴意义的每次拓展一位和 \(nxt\) 数组能极大减少不合法的匹配,时间复杂度 \(O(|s|+|t|)\)。

引出一个定义,记满足 \(s[1,i]=s[|s|-i+1,|s|]\) 的前缀为字符串 \(s\) 的 \(\mathrm{border}\),所有的 \(\mathrm{border}\) 构成 \(\mathrm{Border}(s)\) 集合。

失配树

KMP 处理 \(nxt\) 数组时是一个类似 \(nxt_i\leftarrow j\) 的操作,可以看作连边,根节点是 \(0\),一个前缀对应节点的全部祖先恰好是这个前缀的 \(\mathrm{Border}\) 集合。那么求两个前缀的最长公共 \(\mathrm{border}\) 就是树上 \(\mathrm{LCA}\),可能需要分是否是祖先关系讨论一下。

KMP 自动机

就是只有一个模式串版本的 AC 自动机,只要从 \(nxt_i\) 构建转移指针就行,目测用处不大。

Z 函数

又叫扩展 KMP。

算法思想

定义 Z 函数 \(z_i=\mathrm{lcp}(s,s[i,|s|])\),即后缀和原串的 \(\mathrm{lcp}\)。

考虑维护当前最右端的区间 \([l,r]\),扩展的方法类似 Manacher:

  • 若 \(i>r\),直接暴力拓展;

  • 若 \(i\le r\),那么 \(s[1,r-l+1]=s[l,r]\),于是 \(s[i-l+1,r-l+1]=s[i,r]\),那么 \(z_i\ge \min(z_{i-l+1},r-i+1)\),设为初始值再暴力拓展即可。

复杂度是线性的,证明考虑暴力拓展非 \(O(1)\) 次时 \(r\) 必然增大。

例题

CodeForces-432D Prefixes and suffixes *2000

\(z_i=|s|-i+1\) 的就是 \(\mathrm{border}\),查询出现次数就是 \(z_i\ge l\) 的位置个数。

Periodicity Lemma

定义 \(p\) 是 \(s\) 的一个周期当且仅当对于 \(1\le i\le |s|-p\),有 \(s_i=s_{i+p}\)。感性理解就是周期就是一个字符串划分成若干相等的段,最后一段可以是这些段的一个前缀。

Weak Periodicity Lemma:若 \(p,q\) 都是字符串 \(s\) 的周期且 \(p+q\le |s|\),则 \(\gcd(p,q)\) 也是 \(s\) 的周期。

直观来看 \(p,q\) 导出 \(\gcd(p,q)\) 是类似辗转相除的跳来跳去,存在一个问题:如果将字符串按照两个周期分别补充成无限长,得到的结果可能不相等,例如 \(\texttt{abaababa}\) 如果按 \(\texttt{abaab}\) 和 \(\texttt{abaabab}\) 补充肯定是不相等的,那么跳来跳去就可能出错,所以有一个长度的限制。

弱周期引理的证明比较简单,考虑归纳,规定 \(p\le q\),假设已经证明对于任意 \(x<p,y<q\) 都是成立的,而 \(p=1\) 时显然也成立。由于 \(p+q\le |s|\) 且 \(p\le q\),可以将 \(1\le i\le |s|\) 划分成 \(i\le |s|-q\) 和 \(i>|s|-q\) 两部分。对于前者,\(i+q\) 与 \(i+q-p\) 都在 \([1,|s|]\) 范围内,于是 \(s_i=s_{i+q-p}\);对于后者,实际考虑 \(p\le |s|-q<i\le |s|-(q-p)\),\(i-p\) 与 \(i-p+q\) 都在范围内,于是 \(s_i=s_{i-p+q}\),\(q-p\) 就是 \(s\) 的一个周期,而根据归纳 \(\gcd(q-p,p)=\gcd(p,q)\) 也是 \(s\) 的一个周期。


Periodicity Lemma:若 \(p,q\) 都是字符串 \(s\) 的周期且 \(p+q-\gcd(p,q)\le |s|\),则 \(\gcd(p,q)\) 也是 \(s\) 的周期。

有一个生成函数证明,感觉很有趣。记 \(P(x),Q(x)\) 分别为长度为 \(p,q\) 的周期,\(S_p(x),S_q(x)\) 分别为按照周期补充的无限长串,那么满足:

\[S_p(x)=\dfrac{P(x)}{1-x^p}\equiv S(x)\pmod {x^{|s|}} \]

\[S_q(x)=\dfrac{Q(x)}{1-x^q}\equiv S(x)\pmod {x^{|s|}} \]

于是可以得到:

\[S_p(x)-S_q(x)=\dfrac{P(x)}{1-x^p}-\dfrac{Q(x)}{1-x^q}=\dfrac{1-x^{\gcd(p,q)}}{(1-x^p)(1-x^q)}\left(\dfrac{P(x)(1-x^q)}{1-x^{\gcd(p,q)}}-\dfrac{Q(x)(1-x^p)}{1-x^{\gcd(p,q)}}\right) \]

把后面的东西记作 \(F(x)\),观察可知 \(\deg F(x)<p+q-\gcd(p,q)\le |s|\),而 \(S_p(x)-S_q(x)\equiv 0\pmod {x^{|s|}}\),所以 \(F(x)\equiv 0 \pmod{x^{|s|}}\),根据其度数知 \(F(x)=0\),所以 \(S_p(x)=S_q(x)\),不需要截取,所以后面就能按照辗转相除证明了。

Border Series

参考资料

Z 函数

周期引理

Border Series

标签:le,gcd,dfrac,笔记,算法,KMP,周期,mathrm
From: https://www.cnblogs.com/SoyTony/p/17955245/Learning_Notes_about_KMP_Related_Algorithms

相关文章

  • mit6.828 - lab5笔记(上)
    文件系统结构unix的文件系统相关知识unix将可用的磁盘空间划分为两种主要类型的区域:inode区域和数据区域。unix为每个文件分配一个inode,其中保存文件的关键元数据,如文件的stat属性和指向文件数据块的指针。数据区域中的空间会被分成大小相同的数据块(就像内存管理中的分页)。数......
  • 【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚......
  • Linux服务Systemd笔记
    Systemd简介从CentOS7.x以后,RedHat系列放弃了一直使用的init启动脚本的方式管理服务,改用systemd这个启动服务管理机制。该机制的好处有:平行处理服务,加速开机流程,systemd可以让所有的服务同时启动。服务依赖性自我检查。对服务依据功能进行分类,将多个服务集合成一个群组。......
  • Internlm-chat-7b大模型笔记1
    首先第一次做作业只对着文档来操作,但是发现出现了很多错误因为每段代码都有先后顺序,而且一些是终端一些是Python的代码然后遇到第二个困难是配置ssh的时候因为算力没有了重新进入开发机,但是密钥发生改变,出现以下报错@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    WARNIN......
  • 文心一言 VS 讯飞星火 VS chatgpt (175)-- 算法导论13.3 4题
    四、用go语言,Teach教授担心RB-INSERT-FIXUP可能将T.nil.color设为RED,这时,当z为根时第1行的测试就不会让循环终止。通过讨论RB-INSERT-FIXUP永远不会将T.nil.color设置为RED,来说明这位教授的担心是没有必要的。文心一言:首先,我们需要明确RB-INSERT-FIXUP的功能和实现方式......
  • MCM_算法篇
    frompixivCellularAutomata参考文章:元胞自动机的实现与应用这篇文章将CA的实现给出,具体实现细节可以看:Python实现基于元胞自动机的生命游戏澳洲变燠洲,考拉成烤拉!澳大利亚山火为什么难以控制?......
  • openGauss学习笔记-191 openGauss 数据库运维-常见故障定位案例-出现Error:No space l
    openGauss学习笔记-191openGauss数据库运维-常见故障定位案例-出现Error:Nospaceleftondevice提示191.1出现“Error:Nospaceleftondevice”提示191.1.1问题现象在数据库使用过程中,出现如下错误提示。Error:Nospaceleftondevice191.1.2原因分析磁盘空间不足......
  • elasticsearch使用笔记
    查询POST/GEThttp://192.168.0.1:9200/waf-20*/_search{"query":{"bool":{"must":[{"match":{"src_ip":"192.168.128.190"}},{"range":{&quo......
  • 【教3妹学编程-算法题】移除后集合的最多元素数
    3妹:好冷啊,冻得瑟瑟发抖啦2哥 :这才哪跟哪,上海这几天温度算是高的啦。你看看哈尔滨,那才是冰城。3妹:据说沈阳千名“搓澡大姨”支援哈尔滨?哈哈哈哈2哥 :就像今年的淄博烧烤,可能有炒作的成分3妹:不不,是去年的了,今年已经24年啦。2哥,你说哈尔滨最多能住多少人,这么多人涌入哈尔滨,能住......
  • 计算器算法
    目录思路最简单的计算器(好像也不简单,因为有*/)224772困难计算器可以通解224227和上面的题先把力扣上5道计算器的题目干了,主要使用双栈法思路用一个栈ops存操作,用一个栈nums存数字然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops中,等待与之匹配的......