蓝桥杯-着急的WYF(不同子串个数)-Suffix Array后缀数组

前置知识:后缀数组

参考链接:

https://blog.csdn.net/u013371163/article/details/60469533

https://www.bilibili.com/video/BV1sb411t79N?from=search&seid=13723955058308401416

http://www.cppblog.com/superKiki/archive/2010/05/15/115421.aspx

https://blog.csdn.net/the_ZED/article/details/105796444

后缀:Suffix(i)是指从位置i到字符串S末尾的串

后缀数组SA[i]:SA[i]存储的是第i大的后缀字符串在后缀中的下标【也可以说是 后缀排序后,从小到大每个后缀第一个字符在S中的位子(这个位子代表了它是第几个字符串)。】

名次数组rank[i]:rank[i]存储的是Suffix(i)在后缀中的排名

height[i]:存储Suffix(SA[i])和比Suffix(SA[i]-1)的最长公共前缀的长度。即排名相邻的两个后缀的最长公共前缀。

【sa[i]:第i大的是谁。rank[i]:串i是第几大的。】

 

构造sa数组:

以字符串S=“aabaaaaba”对应下标为012345678

DC3算法 复杂度时间复杂度On 空间复杂度On

一、把后缀分为两部分,然后对第一部分的后缀排序

将下标%3不等于0的分为一部分 1 2 4 5 7 8

将下标%3等于0的分为另一部分 0 3 6

然后对1 2 4 5 7 8进行排序

然后把下标1、2对应的后缀各自补成个数为3的倍数的串

aba aaa ba0

baa aab a00

然后每三个一组看,发现aba baa aaa aab ba0 a00是1 2 4 5 7 8开头的数据

接下来对前三个字母进行On桶排序

二、利用一中的结果,对第二部分的后缀排序

即对 0 3 6 进行排序

s[0]=x[0]+s[1];

s[3]=x[3]+s[4];

s[6]=x[6]+s[7];

三、将一二结果合并,完成排序

把3 0 6 

和8 4 5 1 2 合并

 

posted @ 2022-11-01 10:22  反射狐  阅读(37)  评论(0编辑  收藏  举报