学习后缀数组笔记
学习自:https://www.cnblogs.com/victorique/p/8480093.html 后缀:是字符串的一个特殊子串,以s的第i个字符为第一个元素的后缀为suff(i)。 后缀数组:后缀数组sa[i]就表示排名为i的后缀的起始位置的下标。 相反映射:rk[i]就表示起始位置的下标为i的后缀的排名。 倍增法+基数排序实现后缀数组O(nlogn)排序:思想是先对首字符排序(重复),在对相邻相加再排序,直到所有排名不同即可。(需进一步理解) 最长公共前缀: 我们定义LCP(i,j)为suff(sa[i])与suff(sa[j])的最长公共前缀。 LCP(i,j)=LCP(j,i); LCP(i,i)=len(sa[i])=n-sa[i]+1; LCP引理 LCP(i,k)=min(LCP(i,j),LCP(j,k)) 对于任意1<=i<=j<=k<=n LCP定理 LCP(i,k)=min(min(LCP(j,j-1))) 对于1<i<=j<=k<=n 重要定理: 我们设height[i]为LCP(i,i-1),1<i<=n,显然height[1]=0; 由LCP Theorem可得,LCP(i,k)=min(height[j]) i+1<=j<=k 设h[i]=height[rk[i]],同样的,height[i]=h[sa[i]]; 有: h