最长公共前缀(LCP)
在后缀数组sa的基础上,还需要rank(sa的反数组,表示后缀i的排名)和height(表示sa[i-1]和sa[i]的最大公共前缀)两个数组。
对于满足rank[j]<rank[k]的后缀j和k,LCP(j,k)=RMQ(heght,rank[j]+1,rank[k])。
最关键的地方在于优化height数组的生成方式,朴素的计算需要O(n^2),显然无法接受。但如果以height[rank[i]]的顺序就没问题了,因为height[rank[i]]近似单调递增,O(n)。
int rank[MAXN], height[MAXN]; void getHeight() { int i, j, k = 0; for(i = 0; i < n; i++) rank[sa[i]] = i; for(int i = 0; i < n; i++) { if(k) k--; int j = sa[rank[i]-1]; while(s[i+k] == s[j+k]) k++; height[rank[i]] = k; } }

浙公网安备 33010602011771号