250721-250725 学习笔记
目录
- 专题——字符串综合
- 专题——数据结构
专题——字符串综合
KMP
KMP 旨在求出字符串中相同前后缀(又叫 Border)的长度。定义 \(p[i]\) 为字符串长度为 \(i\) 的 Boarder 长度。
以下数组下表从 \(0\) 开始。
推导过程如下:
- 注意到 \(p[i]-p[i-1]\le 1\),可以通过定义证明。
- 发现 \(p[i+1]=p[i]+1\) 的充要条件是 \(s[i+1]=s[p[i]]\)。
例子:\(\operatorname{KMP}(\texttt{abcdabc}) \rightarrow [0,0,0,0,1,2,3]\) - 接下来发现,如果 \(s[i+1]\not=s[p[i]]\)(即失配),则寻找更小的可能匹配上的位置。这需要去掉当前 Border 的一些字符,只能从前方去掉,即取当前 Border 的一个后缀。所以取 \(p[p[i]-1]\)。
- 如果再次失配,则继续尝试,直到成功匹配或者全部删完。
Z 函数
Z 函数旨在求出 \(s\) 和 \(s[i...n-1]\) 的最长公共前缀(LCP)。特别的,\(z[0]=0\)。
对于 \(i\),我们称区间 \([i,i+z[i]-1]\) 是 \(i\) 的匹配段。
算法维护右端点最靠右的匹配段。为了方便,记作 \([l,r]\)。根据定义,\(s[l,r]\) 是 \(s\) 的前缀。在计算 \(z[i]\) 时我们保证 \(l\le i\)。初始时 \(l=r=0\)。
在计算 \(z[i]\) 的过程中:
- 如果 \(i\le r\),那么根据 \([l,r]\) 的定义有 \(s[i,r] = s[i-l,r-l]\),因此 \(z[i]\ge \min(z[i-l],r-i+1)\)。这时:
- 若 \(z[i-l] < r-i+1\),则 \(z[i] = z[i-l]\)。
- 否则 \(z[i-l]\ge r-i+1\),这时令 \(z[i] = r-i+1\),然后暴力枚举下一个字符扩展 \(z[i]\) 直到不能扩展为止。
- 如果 \(i>r\),那么直接按照朴素算法,从 \(s[i]\) 开始比较,暴力求出 \(z[i]\)。
在求出 \(z[i]\) 后,如果 \(i+z[i]-1>r\),我们就需要更新 \([l,r]\),即令 \(l=i, r=i+z[i]-1\)。
Manacher
Manacher 旨在求出字符串中以第 \(i\) 个字符为中心的回文串半径。
在计算时为了方便,通常会在长度为 \(n\) 的字符串中插入 \(n+1\) 个特殊字符,使偶回文串变成奇回文串。这样可以同时得到奇回文串和偶回文串的半径长度。
例如:\(\texttt{abacaba}\rightarrow \texttt{#a#b#a#c#a#b#a#}\)。
由于刚才的转化,下文中将只讲述求奇回文串半径的求发。
仍然考虑维护右端点最靠右的回文串,记做 \([l,r]\)。设以第 \(i\) 个字符为中心的回文半径为
- 如果
哈希
Trie
专题——数据结构
线段树套平衡树
线段树套平衡树可以解决一些线段树和平衡树都无法单独完成的任务,比如下面这个:
- 单点修改
- 区间求:
- \(k\) 的排名
- 第 \(k\) 小的数
- 求 \(k\) 的前驱 / 后继
线段树套平衡树就是建立一棵线段树,对于每个节点存储一棵平衡树(可以使用 Treap、Splay 等实现)。这里提供一种实现方法,并附上时间复杂度:
- 建立:仿照线段树建树方法。直接向「此节点平衡树」中插入「此节点维护区间中的所有数字」。 \(\mathcal{O}(\log^2(n))\)。
- 单点修改:找到线段树上「区间包含被修改位置」的节点,删除这个节点存储线段树中的对应节点,并插入新节点。 \(\mathcal{O}(\log^2(n))\)。
- 区间求排名:将这个数在线段树维护区间两侧的排名相加。如果数字不在当前节点维护的区间内则返回 \(0\)。 \(\mathcal{O}(\log^2(n))\)。
- 区间求第 \(k\) 小:考虑二分,如果当前 \(\operatorname{mid}\) 的排名过大则缩小 \(r\),否则缩小 \(l\)。 \(\mathcal{O}(\log^3(n))\)。
- 区间求前驱 / 后继:对这个数在线段树维护区间两侧的前驱 / 后继求较大 / 较小值。如果数字不在当前节点维护的区间内则返回 \(\operatorname{-\infty}\) 或 \(\operatorname{\infty}\)。 \(\mathcal{O}(\log^2(n))\)。
本文来自博客园,作者:cwkapn,转载请注明原文链接:https://www.cnblogs.com/cwkapn/p/18998692


浙公网安备 33010602011771号