SA & SAM
前言
本文为关于 SA & SAM 的学习笔记/做题记录,参考价值不大,但有些好题可以让你学习到巧妙的思想/trick。
一些约定
\(s[l,r]\) 表示字符串 \(s\) 从 \(l\) 到 \(r\) 的一段子串。
\(pre_i\) 表示字符串 \(s[1,i]\)
\(suf_i\) 表示字符串 \(s[i,n]\)
SA 的基本概念,算法流程,性质及其应用。
还是引入一下吧。
后缀排序
给定字符串 \(s\),求所有后缀的字典序排名,一个后缀 \(pre_i\) 的排名记为 \(rk_i\)。
如何实现呢?考虑倍增,记 \(Suf_{i,j}\) 为从 \(i\) 开始长度为 \(2^j\) 的后缀,排名为 \(rk_{i,j}\)(若 \(i+2^j>n\) 则默认后几位为空字符),考虑按 \(rk_{i,j}\) 为第一关键字,\(rk_{i+2^j,j}\) 为第二关键字排序,就能求出 \(rk_{i,j+1}\),复杂度为 \(O(nlog_2n)\),可以用桶排优化至 \(O(nlog_2n)\)
后缀数组
记 \(sa_i\) (suffix array) 为排名为 \(i\) 后缀下标,\(rk_i\) 为 \(suf_i\) 的排名,\(sa\) 和 \(rk\) 互为反数组。
h 数组
定义 \(h_i=lcp(suf_{sa_i},suf_{sa_{i+1}})\)。
有性质 $$
可能上面以后会补。