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}})\)
有性质 $$

可能上面以后会补。

做题记录

posted @ 2024-08-03 14:02  SmileMask  阅读(9)  评论(1编辑  收藏  举报