華麗地處理字符串

後綴數組 

將A和B拼接後,累計分屬兩者的後綴對應的LCP-K+1即爲答案,但窮舉不是個好主意。

如果能快速求出任意兩個後綴的最長公共前綴的話,利用類似尺取法的技巧就可以在線性時間統計一段區間了。

而任意兩個後綴的最長公共前綴爲該區間的LCP值的最小值。hankcs.com 2017-02-08 下午11.34.17.png

在掃描一段LCA>=K的區域中,如果使用單調棧維護LCP,維護棧頂使LCP最小,就可以快速得到任意爬取區域的最長公共前綴。在“尺取法”爬取的過程中,更新出棧的元素對貢獻值的影響,累積到答案中即可。

    #include <iostream>
    #include <string>
    #include <algorithm>
     
    const int MAX_L = 100000 + 1;
    const int MAX_N = 2 * MAX_L + 1;
    std::string S;
    int n, k;
    int sa[MAX_N + 1], lcp[MAX_N + 1];  // sa[i] := 字典序爲i的後綴的起始下標;lcp[i] := S[sa[i]...]與S[sa[i+1]...]的最長公共前綴長度
    int rank[MAX_N + 1], tmp[MAX_N + 1];
     
    // 比較(rank[i], rank[i+k])和(rank[j], rank[j+k])
    bool compare_sa(const int i, const int j)
    {
        if (rank[i] 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章