SA & SAM

1. P4051 [JSOI2007] 字符加密

给定一个环字符串,输出从每一位开始读的字典序

sol:复制一份跑 $SA$ 即可

2. P2807 [USACO07DEC]Best Cow Line G

$n$ 个数,从队头队尾取数,使字典序最小

sol:贪心,优先取最小,相同时,比较正反的字典序大小,原串复制一份后插入未出现字符连接,跑 $SA$ 比较 $rk$。

3. CF232D Fence

给定序列 $h$

$Q$ 次询问 $l1, r1$

有多少对 $l2, r2$ 满足二者没有交集且 $h_{l_1 + i} + h_{l_2 + i} = h_{l_1} + h_{l_2}$

sol:考虑差分,转化式子可得目标区间和询问区间为相反数时成立,复制一份相反数接在原差分序列后,用特殊符号隔开。

首先 $st$ 表维护区间 $lcp$,然后在 $rk$ 询问串附近二分,得到 $rk$ 范围,然后考虑 $l,r$ 的取值范围,这等价于一个二维数点,主席树维护。

4. CF666E Forensic Examination

给定 $S$,以及字符串数组 $T_{1, m}$ 询问 S 的子串 $[l, r]$ 在 $T_{l, r}$ 中哪个子串出现次数最多

sol:首先将所有串连一起,特殊字符分开,然后跑 $SA$,将询问离线,求出每一个 $rk$ 的范围,然后考虑莫队,记录 $rk$ 对应的编号,用线段树实现单点加,维护区间最大值。

另:好像有分块写法()

5. P2852 [USACO06DEC]Milk Patterns G

给定序列,询问最长的至少出现 $K$ 次的子串长度

sol:相当于长度至少为 $K$ 的 $height$ 的最小值,用单调队列维护最大值即可。

6. P1117 [NOI2016] 优秀的拆分

求出所有子串的形如 $AABB$ 的拆分总方式,不考虑相同子串。

sol:枚举 $A$ 长度,每隔 $A$ 长度建立哨兵节点,正反向各求一遍 $SA$,可以求出相邻两个节点的 $lcp, lcs$,然后由于长度必定最多且只横跨两个节点,因此可以用差分记录下每一半的选取方案,最后左右相乘即可。

7. P4248 [AHOI2013]差异

$$\sum_{1 \leq i < j \leq n} len(T_i) + len(T_j) - 2 * lcp(T_i, T_j)$$

$T_i$ 代表从 $i$ 开始的后缀

前面很好求,后面等价于求 $height$ 的区间最小值,考虑每个点对答案的贡献,向左向右找出它的贡献区间,用单调栈维护。

tip:对于相同元素,必须一边取等一边不取,否则会算重。

8. P3181 [HAOI2016]找相同字符

从两个字符串中各取一个相等子串,有多少种取法,不同位置算不同方法

sol:和上题类似方法,拼接后单调栈计算,然后容斥一下,减去原来两个字符串内部的贡献。

9. P2178 [NOI2015] 品酒大会

在一个序列里,每个序列有一个权值和一个标号,现在求出对于固定的 $k$,所有 $i, j$ 满足 $lcp(i, j) >= k$ 的权值相乘的最大值,$k$ 从 $1$ 到 $n$

sol:考虑从大到小做,求出 $height$,然后每次 $k$ 就相当于求出 $height = k$ 的位置然后将其合并,维护集合大小,最大,次大,最小正数,最大负数的值即可。

10. POJ 3581 Sequence

给定字符串,切成 $3$ 段,翻转每段,使得字符串最小

sol:首先反过来跑一遍 $SA$,找出第一段,剩下的相当于环上选起点,复制一遍在前半段找最小 $rk$ 即可。

posted @ 2022-03-03 14:31  wxg_Jay  阅读(34)  评论(0)    收藏  举报