顧名思義,suffixarray(以下有時簡稱sa) 和字串的字尾有關。
字尾:字串中某個位置一直到結尾的子串。(sa中討論包括了原串和空串),所以共有len+1個字尾。
字尾陣列: 字串的所有字尾組成的按字典序從小到大排好的陣列。由於sa中記錄的都是字串的字尾,所以sa只需要記錄其表示的字尾的起始位置。
由於比較字典序是o(n)的,所以暴力演算法的複雜度將是o(n^2logn)。通過一些演算法可以降到線性複雜度。這裡先介紹一種簡單的o(nlognlogn)的演算法。
該演算法的思想是通過倍增法降低了比較字典序的大小的複雜度o(n)到o(logn)。其求解時不先算字尾,而是先算長度為1的子串的字典序大小排列,然後得到乙個rank陣列,即該子串在所有子串中排位的值。字典序越小,rank值越小。
rank[k][i] 表示起始位置為i的長度為k的子串在所有長度為k的子串中的字典序大小。
這時我們要比較長度為2k的子串的大小的話,其第i個位置的長度為2k的子串的大小可以通過比較rank[k][i]和rank[k][i+k]來實現。
sa中的sa[i]表示字典序位i的字尾串的起始位置。
const int maxn = 100000 + 5;
int _k, _len;
int _rank[maxn];
int _tmp[maxn];
int _sa[maxn];// 字尾陣列。
bool _cmp(int i, int j) else
}void suffix_sa(string s, int* sa)
sa[_len] = _len;
_rank[_len] = -1;
for ( _k=1; _k<=_len; _k<<=1)
}copy(_tmp, _tmp+_len+1, _rank);
}}
字尾陣列(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...
字尾陣列 Suffix Array
sa是一種解決多模板匹配問題的演算法。大致就是將字尾處理出來然後按照字典序排個序。時間主要浪費在排序上。sa陣列sa i 表示rk為i的字尾的開始位置。rk陣列rk i 表示以i位置開始的字尾的rank為多少。基數排序 先排個位,然後十位依次往下,穩定演算法。const int n 1e6 5 開二...