字尾陣列 Suffix Array

2021-09-26 10:54:36 字數 680 閱讀 8049

sa是一種解決多模板匹配問題的演算法。大致就是將字尾處理出來然後按照字典序排個序。時間主要浪費在排序上。

sa陣列sa[i]表示rk為i的字尾的開始位置。

rk陣列rk[i]表示以i位置開始的字尾的rank為多少。

基數排序

先排個位,然後十位依次往下,穩定演算法。

const int n = 1e6 + 5; // 開二倍吧

int sa[n], rk[n], height[n], tax[n], tp[n], a[n], n, m;

//rk[i] 第i個字尾的排名; sa[i] 排名為i的字尾位置; height[i] 排名為i的字尾與排名為(i-1)的字尾的lcp

//tax[i] 計數排序輔助陣列; tp[i] rk的輔助陣列(計數排序中的第二關鍵字),與sa意義一樣。

//a為原串

void rsort()

int cmp(int *f, int x, int y, int w)

//通過二元組兩個下標的比較,確定兩個子串是否相同

void init()

void suffix()

}void cal_height()

int dp[n][20];

void st()

int rmq(int l, int r)

Suffix Array 字尾陣列

顧名思義,suffixarray 以下有時簡稱sa 和字串的字尾有關。字尾 字串中某個位置一直到結尾的子串。sa中討論包括了原串和空串 所以共有len 1個字尾。字尾陣列 字串的所有字尾組成的按字典序從小到大排好的陣列。由於sa中記錄的都是字串的字尾,所以sa只需要記錄其表示的字尾的起始位置。由於比...

字尾陣列(Suffix Array)

字尾陣列是處理字串的有力工具。sa儲存乙個字串按字典序排列的字尾,如圖 rank陣列儲存字尾i的名次,就是把sa反過來,上圖中 rank 1 2,rank 2 8 height陣列儲存相鄰兩個sa字尾之間公共字首的長度,如圖 思路 用倍增的方法對每個字元開始的長度為2 k2 k 2k子字串進行排序,...

字尾陣列suffix array

倍增演算法,時間複雜度o nlogn sa從小到大儲存相對大小的下標 理解lsd,x陣列,sa陣列 char s maxn int sa maxn t maxn t2 maxn c maxn n void build sa int m void build sa int m int cmp suff...