【模板】后缀数组
致谢jdr和ldl学长$qwq$ 后缀数组,顾名思义,就是对于一个字符串的每一个后缀的数组。 比如对于字符串fatcat,其所有后缀如下: fatcat atcat tcat cat at t 其按照字典序排序结果如下: at atcat cat fatcat t tcat 一般来说,对于每个后缀,要求的数组有3个: rank[]:字符串中以第i位开始的后缀的排名 sa[]:排名为i的后缀开始的那一位的下标,和rank互为逆映射(sa[rank[i]] = i,反之亦然) height[]: 排名为i和i-1的后缀的LCP(最长公共前缀)长度(显然排名邻近的后缀最长公共前缀较长) 后缀数组有用的部分是height[],核心是求sa[]。 求sa[]需要用到倍增法。 假设已经求出长度为k的字符串排序后的数组,可以通过合并求出长度为2k的。 单次排序复杂度为O(N),每次长度扩大一倍,共需扩大logN次。总的时间复杂度为O(NlogN) 每次合并i和i+2^k(k=0~…)。比如上图中第二次,3代表(1,2),5代表(3,4),35就代表(1,2,3,4)。 桶排序(bucket sort)是怎么排的? 因为我喜欢buck,所以把桶叫做buck[] 类似计数排序,首先要知道每种数有几个。 然后用前缀和的方式,比如1,1,4,5,1,4, 先枚举每一位,相应的buck[s[i]]++