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...