首页 > 其他分享 >扩展KMP学习笔记

扩展KMP学习笔记

时间:2023-01-09 14:11:39浏览次数:38  
标签:匹配 函数 int 扩展 笔记 char KMP

前置芝士: KMP, manachar

告示:本文字符串下标均从 $1$ 开始。

扩展KMP算法提供了一个计算 $Z$ 函数的方法。

求解 $Z$ 函数
定义 $Z$ 函数 $z_i$ 表示字符串 $s$ 以下标 $i$ 为开头的后缀与 $s$ 的最长公共前缀。

根据定义, $z_1 = n$, $n$ 为 $s$ 的长度。


如果直接暴力求解,显然每计算一次 $z_i$ 都要花费 $n$ 的时间,总时间是 $O(n^2)$。

不过可以通过扩展KMP算法,将此优化到 $O(n)$。

假设我们计算 $z_i$ 时, $1 \leq j < i$ 的 $z_j$ 已经全部算出。

我们可以维护一个 $r$ 最大的能与 $s$ 前缀匹配的$s[l:r]$。(这句话好好理解)

对于 $i \leq r$ 直接将 $z_i$ 初始成 $min(z_{i-l+1}, r-i+1)$, 否则为 $0$。

然后暴力往后匹配,求出 $z_i$, 更新之前的 $l,r$。

因为匹配次数跟 $r$ 相同, 所以是 $O(n)$ 的。

CODE

inline void getZ(char *s, int n) {
    for (int i = 1; i <= n; ++ i) z[i] = 0;
    z[1] = n;
    for (int i = 2, l = 0, r = 0; i <= n; ++ i) {
        if (i <= r) z[i] = min(z[i-l+1], r-i+1);
        while (i + z[i] <= n && s[i+z[i]] == s[z[i]+1]) ++ z[i];
        if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1;
    }
}
View Code

求解文本串的后缀与模式串的匹配

根据上文, 我们可以先求出模式串的 $z$ 函数。

接着类似于 KMP, 我们对文本串开始对模式串进行匹配,发现计算方式与 $z$ 函数类似,于是只要改一下就行了。

CODE

inline void exkmp(char *s, int n, char *t, int m) {
    getZ(t, m);
    for (int i = 1; i <= n; ++ i) p[i] = 0;
    for (int i = 1, l = 0, r = 0; i <= n; ++ i) {
        if (i <= r) p[i] = min(z[i-l+1], r-i+1);
        while (i + p[i] <= n && s[i+p[i]] == t[p[i]+1]) ++ p[i];
        if (i + p[i] - 1 > r) l = i, r = i + p[i] - 1;
    }
}
View Code

 

标签:匹配,函数,int,扩展,笔记,char,KMP
From: https://www.cnblogs.com/CikL1099/p/17036890.html

相关文章

  • WAMP安装curl扩展并发起https请求
    wamp安装curl扩展的方法:  安装出现PHPExtension"curl"mustbeloaded错误。解决方法如下:1> 在 WAMP或XAMPP 目录下“搜索”功能查找到 httpd.conf:      ......
  • 只是一篇笔记
    笔记//Awake用于在游戏开始之前初始化变量或游戏状态,不管SetActive多少次,它只会调用一次voidAwake(){print("1");GetTextFromFIle(textF......
  • 退火算法学习笔记
    初创建于2022-02-0900:29前段时间学习了一下退火算法。这里简单记一下踩过的坑~退火算法是一种搜索算法,我认为其核心思想便是”以一定的概率接受一个更差的解“,这样可......
  • fabric2.2学习笔记1
    fabric2.2学习笔记120201303张奕博2023年1月9日hyperledgerfabric结构分析每个Server作用:AdminServer:控制该节点的命运,可以删除该节点所在的进程。(StartStopGet......
  • CCSP学习笔记-NIST 800-145
    本文英文版来自美国国家标准与技术实验室的文档SpecialPublication800-145《TheNISTDefinitionofCloudComputing》September2011版本。一 云计算概念定义Clo......
  • Linux学习笔记:终端删除键失效解决办法
    一、删除键变空格近日在安装vi时遇到报错,遂卸载了部分包进行重新安装。安装后出现终端乱序,输错命令按Backspace删除键进行删除时不能删除反而添加空格,并且导致某些快......
  • wps 笔记
    table.Cell(arr[3].length/2+3+num00,1).Range.ParagraphFormat.Alignment=0 //文字居左对齐table.Range.Cells.VerticalAlignment=1;//文字垂直居中 ......
  • 读编程与类型系统笔记02_基本类型
    1. 空类型1.1. uninhabitabletype1.1.1. 声明从不返回的函数1.2. 不能有任何值的类型,其可取值的集合是一个空集合1.3. 函数不返回的原因1.3.1. 函数在所有代......
  • 英语语法个人笔记-乱写-哈哈
       "of"也是一个介词,它用来表示"permanentdefeat"是"flag"的一部分,即"permanentdefeat"这个标志就是"flag"。所以"theflagofpermanentdefeat"就是"永久失败的......
  • Python笔记——列表一:列表简介(Python编程:从入门到实践)
    一、列表是什么列表:由一系列按特定顺序排列的元素组成(列表是有序集合)。表示:用方括号[]来表示,并用逗号来分隔其中的元素。访问:访问列表元素,可指出列表的名称,再指出......