P3809 【模板】后缀排序 良心讲解

感谢yyr学长的讲课以及自为风月马前卒大佬的这篇博客

一直早有耳闻后缀数组SA的大名,今天yyr学长也讲解了有关于后缀数组的内容,后缀排序又是能够求出后缀数组的操作,感觉其中的原理理解起来还是很简单的,不过就是按第一关键字和第二关键字排序罢了。但是代码的细节却不太好理解。

后缀排序时要用上好几个数组,我先在这里讲解用到的数组有哪些:

而在对字符排序的时候,因为常用的sort时间复杂度太高(nlogn),所以这样的情况下我们就会选择更优的基数排序(O(n))。关于基数排序,在此有一个简单的介绍:

 

百度上的解释还是比较详细的,其实用通俗的话来说就是按多个关键字来排序,这很好的满足了我们后缀排序的需求。

 首先我们对每一位的单个字符进行基数排序

按自为风月马前卒大佬的话来说,因为单个字符的ASCII值是可以确定的,所以可以看做一个(fir[i],i)的二元组,所以我们先将这个二元组进行排序。

可以利用前缀和的思想求出每一个出现过的值域的排名。因为值域是单调的,字符集值域的上界可以定为127(我也不知道为什么这样定)。

原文地址:https://www.cnblogs.com/LJB666/p/11191059.html