倍增演算法,時間複雜度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 get_height() { for(int i=0;ivoid 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)。
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 開二...