后缀数组和后缀自动机
后缀数组
后缀数组就是把一个字符串的后缀用一个数组储存下来,简单来说,我们要把字符串的每个后缀按照字典序排序,维护以下几个数组:
- sa[i]:排名为i的后缀的起始位置的下标
- rk[i]:起始下标为i的后缀的排名
- height[I]:排名第I个和排名第i-1个的后缀的最长的公共前缀
具体构造可以用基数排序,时间复杂度是O(nlogn)。
一个比较重要的性质:排名第i个和排名第j(j>=i)个的后缀的LCP为min{height[i]…height[j]},具体操作可以用st表O(nlogn)预处理,O(1)查询。
后缀自动机
后缀自动机的比较高大上的定义是一个能接受字符串s的所有后缀的最小化确定有限状态的自动机。
具体来说,后缀自动机是一个DAG,顶点为状态,边为状态的转移。其中有一个初始状态,由它可以到达其余所有状态。
后缀链接是后缀自动机的核心(个人认为),后缀链接指向了当前后缀在不同等价类(endpos集合)中的最长的后缀,一个重要的性质是后缀链接构成了一颗以初始状态为根的树,有了这个性质,很多问题就可以上树,也就可解了。