最长公共前缀(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;
    }
}

 

posted @ 2019-07-26 23:14  Hanasaki  阅读(717)  评论(0)    收藏  举报