【字符串】后缀数组SA
后缀数组 概念 实际上就是将一个字符串的所有后缀按照字典序排序 得到了两个数组 \(sa[i]\) 和 \(rk[i]\) ,其中 \(sa[i]\) 表示排名为 i 的后缀, \(rk[i]\) 表示后缀 i 的排名 注意到 \(rk\) 和 \(sa\) 是互逆的,即 \(sa[rk[i]]=rk[sa[i]]=i\) 先讨论几个关于 \(lcp\) 的性质,令 \(lcp(i,j)\) 表示 \(sa[i]\) 和 \(sa[j]\) 的最长公共前缀 \(lcp(l,r)=min(lcp(l,i),lcp(i,r)),l\le i\le r\) ,注意这里只需要枚举任意一个 i 即可 证明: 令 \(p=min(lcp(l,i),lcp(i,r)),sa[l]=u,sa[r]=v,sa[i]=w\) 由于 \(u\) 和 \(w\) 的前 \(p\) 位相同, \(v\) 和 \(w\) 的前 \(p\) 位相同 所以 \(u\) 和 \(v\) 的 \(lcp\) 至少为 \(p\) 假设 \(u\) 和 \(v\) 的 \(lcp>p\) ,不妨设其为 \(q=p+k\) 我们知道 \(u[q]\neq w[q],v[q] \neq w[q]\) ,并且 \(w[q]\ge u[q],v[q]\ge w[q]\) 那么 \(w[q]\) 只能是 \(>u[q]\) ,且