字串演算法之後綴陣列

2021-08-14 17:39:17 字數 1015 閱讀 6709

字串演算法一直是我最不願碰的東西,包括dp。

」ababs」

中所有的字尾串為」ababs」,」babs」,」abs」,」bs」,」s」

我們按照字典序排列即為

」ababs」,』abs」,」babs」,」bs」,」s」

而字尾陣列就是用來求字尾的字典序的

sa[i]為排名為i的字尾第乙個字元在主串裡的位置.

譬如上面的例子

sa[1]=1,sa[2]=3,sa[3]=2,sa[4]=4,sa[5]=5

rank[i]記錄首字元在i位置的字尾的排名

很明顯sa與rank互為逆運算

簡單講:

sa是排名第幾的位置

rank是此位置排名第幾

首先我們用基數排序求到每個字串中的字元的名次。這裡我們就以aabaaaab為例,如圖:

第一輪之後的結果就是這樣。那麼第二輪,就是對每個字尾的前兩個字元進行排序。因為每個單字元的名次已經得出。就相當於對乙個二元組(x,y)進行排序,且以 x 為第一關鍵字,以 y 為第二關鍵字。這麼排序之後就得到了這麼一幅圖:

接下來繼續倍增,對前四個字元進行排序,此時依舊相當於對乙個二元組(x,y)排序,排序規則相同。此時的 x 和 y 分別表示前兩個字元的名次和第

三、四個字元的名次(在第二次排序已經將其全部求出),所以同上進行排序,就能得到這樣的一幅圖:

此時我們發現每個排名都不相同,即可停止倍增了。

這裡給出構造字尾陣列的**

int make_sa(int n)

}

演算法合集之《字尾陣列 處理字串的有力工具》

字尾陣列 sa i 表示排名第i個的首字母位置 rank i 第i個數的排名 height i sa i 和sa i 1 的最長公共字首 suffix j 和suffix k 的最長公共字首為height rank j 1 height rank j 2 height rank j 3 height...

字串匹配之後綴樹

試想有這樣乙個問題,有乙個長度為n的字串a n值很大 還有乙個模式串b,b的長度為m n m很大,說明b只是乙個小片段 此時需要判斷b是否是a的字串。如果我們使用kmp演算法的話,那麼複雜度為o n 對a串進行k次模式匹配的話就是ko n 此時為了降低複雜度,我們可以考慮預處理長字串a,是的,如果我...

字串 字尾陣列

n 字串的長度。m 當前字尾 離散化後 的值域。對於char可以跳過離散化,初值取128即可,對於int要離散化,初值取n即可,初值要保證覆蓋整個值域。sa i 排名為 i 的字尾的起始位置。rk i 起始位置為 i 的字尾的排名。驗證 const int maxn 1000000 10 int n...