后缀数组学习笔记

后缀数组是个很神奇的数据结构。

是一道模板题。

概念

后缀数组处理的是一个字符串所有的后缀排序后的结果。

算法

我们考虑用倍增来解决这个问题。

第$H$轮排序的目标是让从所有位置开始$2^H$个字符的字符串都排好序

为了表述方便,我们定义一些数组。

在第$H$轮中:

$SA_i^H$表示排名为$i$的后缀从$SA_i^H$开始

$rnk_i^H$表示从i开始的后缀排名为$rnk_i^H$

然后考虑从第$H$轮转移到第$H+1$轮。

转移的时候先按照$rnk_{i+{2^H}}^H$排序,再按照$rnk_i^H$排序。

排序用基数排序,要不然复杂度多一个$log$。

初始情况注意一下即可。

基数排序

基数排序的核心是计数。

首先记录每一个数出现的次数,然后作次数的前缀和(算出每个数最后出现的位置),倒着循环把当前的数填入这个数可填的最后位置,并且把这个数可填的最后位置前移一格。

代码

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×