字尾陣列suffix array

2021-09-08 04:36:49 字數 813 閱讀 1078

倍增演算法,時間複雜度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_suffix(char *pattern,int p)

int find(char *p)

return -1;}/*

設suffix(k)是排在suffix(i-1)前一名的字尾。則它們的最長公共字首是h[i-1]

。那麼suffix(k+1)將排在suffix(i)的前面(這裡要求h[i-1]>1,假設h[i-1]≤

1,原式顯然成立)而且suffix(k+1)和suffix(i)的最長公共字首是h[i-1]-1,

所以suffix(i)和在它前一名的字尾的最長公共字首至少是h[i-1]-1。依照h[1]

,h[2],……,h[n]的順序計算。並利用h陣列的性質,時間複雜度能夠降為o

(n)。

*/ void get_height() { for(int i=0;i

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

sa是一種解決多模板匹配問題的演算法。大致就是將字尾處理出來然後按照字典序排個序。時間主要浪費在排序上。sa陣列sa i 表示rk為i的字尾的開始位置。rk陣列rk i 表示以i位置開始的字尾的rank為多少。基數排序 先排個位,然後十位依次往下,穩定演算法。const int n 1e6 5 開二...