【专题】后缀数组 SA
警告:SA多次使用一定要清空,我也不知道为什么。
虽然有不少此类题目可以用字符串hash瞎搞
记住代码中每个数组的含义:
数组 | 含义 |
---|---|
$sa_i$ | 排名为$i$的后缀的起始位置 |
$rk_i$ | 后缀$s_{i \cdots n}$的排名 |
$tp_i$ | 临时数组,用来在基数排序中记录临时排名 |
$ht_i$ | 第$rki$个后缀和第$rk{i-1}$个后缀的$LCP$ |
一些性质
可重叠最长重复子串
即$ht$数组的最大值。
不同子串个数
即$\frac{n \times (n + 1)}{2} - \sum\limits_{i=1}^{n}{ht_i}$(易证)。
任意两个后缀的$LCP$
设分别为后缀$s{i \cdots n}$和$s{j \cdots n}$,其中$i \lt j$,$LCP = \min\limits_{k=i+1}^{j}{ht_k}$,用$RMQ$解决。
题目
P2408 不同子串个数 题解 P4051 [JSOI2007] 字符加密 题解 [AHOI2013] 差异 题解 P3181 [HAOI2016] 找相同字符串 UVA11107 Life Forms P2336 [SCOI2012] 喵星球上的点名 P4341 [BJWC2010] 外星联络 P4070 [SDOI2016] 生成魔咒 P5028 Annihilate P4081 [USACO17DEC] Standing Out from the Herd P P4094 [HEOI2016/TJOI2016] 字符串 P1117 [NOI2016] 优秀的拆分 P3900 [湖南集训] 图森 P4770 [NOI2018] 你的名字 P6095 [JSOI2015] 串分割模版代码
1 | struct SuffixArray { |