如何用 KMP 偏序 Z 函数】的更多相关文章

\(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置定义 记 \(\pi_i\) 表示 \(\max\{j|j<i\land T[1\cdots j]=T[i-j+1\cdots j]\}\),即 \(T[1\cdots i]\) 最长 Border 的长度 III. 算法实现 假设我们已经知道了 \(\{\pi_i\}\),我们能够写出如下的匹配伪…
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 LCP 长度数组 \(p\). 数据范围:\(1\le |a|,|b|\le 2\times 10^7\). 蒟蒻语 别的题解为什么代码那么长.讲解那么复杂?蒟蒻不解,写篇易懂一点的,希望没有错误理解. 注意:蒟蒻的下标是从 \(0\) 开始的. 蒟蒻解 定义 \(z(i) (i>0)\):后缀 \(…
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 反正这个知识点填过了.. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<ctime> #include<cctype> #include<…
KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) 为一个长度为\(n\)的数组\(\pi\),其中\(\pi_i\)表示 如果字串\(s[0...i]\)存在一对相等的真前缀和真后缀\(s[0...k]~and~s[i-(k-1)...i]\),则\(\pi_i\)为这个真前缀(真后缀)的长度\(k\) 如果有不止一对,则\(\pi_i\)为其中…
字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 \(0\) 开始.\(|s|\) 表示字符串 \(s\) 的长度. 对于字符串 \(s\),记其每一个字符分别为 \(s_0, s_1, \cdots, s_{|s|-1}\). 子串 \(s_l, s_{l+1}, \cdots, s_{r-1}, s_r\) 简记为 \(s[l:r]\).特别地,若 \(l=0\),可记作 \(s[:r]\):若 \(…
exkmp 用于求解这样的问题: 求文本串 \(T\) 的每一个后缀与模式串 \(M\) 的匹配长度(即最长公共前缀长度).特别的,取 \(M=T\),得到的这个长度被称为 \(Z\) 函数."函数"只是一个叫法,它本质上是个数组...为了好听,后面叫他"\(Z\) 数组" (互联网上的确有人这么叫) 符号(字符串) \(|S|\) 表示 \(S\) 的长度 \(S[l:r]\) 表示 \(S\) 从 \(l\) 到 \(r\) 的子串.如果 \(l\) 空着,默认…
洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i,j}\) 表示在前 \(i\) 个字符串拼出的长度为 \(j\) 的字符串中,字典序的最小的串是什么,那么显然 \(dp_{i,j}\) 的转移就在 \(dp_{i-1,j-|s_i|}+s_i\) 和 \(dp_{i-1,j}\) 中比个大小即可,但是由于字符串字典序比大小,以及存储字符串均可达到线性复杂…
简单记一下,避免忘记. z 函数 对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度. \(O(n)\) 求出 z 函数 我们添加一个分隔符,将 \(S\) 的真正下标变为从 1 开始.此时显然 \(z(1)=n\). 我们需要 \(r\) 最大的匹配串 \(S[l:r]\) ,即为当前最大的 \(l+z(l)-1\) . 如果 \(i > r\),显然此时任何之前的 \(z(j)\) 都无法对其提供贡献,所以只能从 \(0\)…
KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息. 首先需要明白: 1).next[j]=k的含义: 在这个模式字符串的第j个字符之前,已经存在了一个长度为k-1的子串相同,即:‘t1,t2,...tk-1’=‘tj-k+1,...tj-1’.…
写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有问题的可以@我 import randomhe=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',…