后缀数组
后缀数组 先下几个常见的定义 $s(i, j)$表示$[i, j]$形成的连续子串 $suf[i]$表示以$i$为开头的后缀 $rank$数组:$rank[i]$表示将$1\sim n$的后缀排序后,$suf[i]$的排名 $sa$数组:$sa[i]$表示将$1 \sim n$的后缀排序后,排第$i$的在哪里 举个例子: sort(a + 1, a + n + 1, cmp); 当我们采用上述代码之后,$a$数组存下的实际就是排第$i$的在哪里 $sa$数组不会相同,因为后缀的长度互不相同 在假想状态下,我们考虑在字符串的某尾加上无限个$0$ 这样子,我们可以使得两个后缀具有相同的长度,便于比较 比如字符串"$abaa$" 我们实际上是在比较这4个字符串的排名: $abaa,baa0,aa00,a000$ 先看一个有趣的事情: 对于字符串$S = S_1 + S_2, T = T_1 + T_2$,且$|S_1| = |S_2|, |T_1| = |T_2|$ 如果$S_1 < T_1$,那么$S < T$ 如果$S_1 = T_1;and;S_2 < T_2$,那么$S < T$ 这要怎么利用呢? 也就是说,我们现在把所有的后缀都看做是长度为$n$的字符串 我们先处理出所有的$s(i, i)$的字典序排名,如果不存在$s(i, i) = s(j, j)$,那么我们的序排好了 否则