字尾陣列 學習筆記

2021-08-19 19:40:32 字數 2110 閱讀 2379

字尾陣列是處理字串的強有力的工具…..

在字串處理當中,字尾樹和字尾陣列都是非常有力的工具。其實字尾陣列是字尾樹的乙個非常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽中字尾陣列比字尾樹要更為實用。−−

−−− −−

−我們定義su

ffix

(i) suf

fix(

i)為以i開始到結束的字尾. sa

[i] sa[

i]:排第i i

名的字尾的位置,排名是按照字典序來排的 ra

nk[i

]' role="presentation" style="position: relative;">ran

k[i]

rank

[i]:

suff

ix(i

) suf

fix(

i)排第幾

這時候我們就會發現sa

和rank[

] sa[

]和ra

nk互為逆運算,即sa

=ran

k−1 sa=

rank

−1cc

:基數排序的陣列 x[

],y[

] x

,y:第一二關鍵字的排名

我們怎樣構建字尾陣列呢?

我們就是對所有的su

ffix

(i) suf

fix(

i)進行排序,然後計算出sa

和rank[

] sa[

]和ra

nk要排序的話快排是o(

nlog

n)o (n

logn

),我們可以用基數排序來o(

n)o (n

)的時間來進行排序

一般兩種方法d3

d

3和倍增

倍增相對來說比較好寫,所以我們這裡介紹倍增演算法

我們就是先選定當前

i i

的排名作為第一關鍵字,然後往後第2k

' role="presentation" style="position: relative;">2k2

k個字元的排名作為第二個關鍵字,直到2k

>

n 2

k>

n字尾陣列的奧秘就隱藏在下面這一張圖中

假如我們現在要構建aa

bab aab

ab的字尾陣列

下面是倍增求排名的過程

下面是sa和

rank

s a和

rank

陣列

字尾陣列的構建難理解的就是基數排序;

void build_sa()

}

字尾陣列比較有名還源於he

ight

h ei

ght陣列 he

ight

h ei

ght陣列的求解可以做到o(

n)o (n

)這要基於he

ight

h ei

ght[

]的乙個性質 he

ight

[i]>=he

ight

[i−1

]−1 hei

ght[

i]>=he

ight

[i−1

]−1這裡的

i i

指的是排名

void built_height()

}

字尾陣列學習筆記

要用好字尾陣列要先理解裡面幾個陣列的概念 sa i 表示字典序第i大的字尾下標 字典序排名依次是1 len stri ng ra nk i 表示下標為i的字尾字典序排名 he ight i 表示sa i 和sa i 1 最長公共字首的長度.乙個性質 lc p su ffix i suff ix j ...

字尾陣列 學習筆記

剛剛學完回文自動機 來學字尾陣列 一開始思路看得懂 但是 看不懂呀 一堆神仙 洛谷p3809 勿謂我,何強過者,炸哉!我們需要一種新的演算法 字尾陣列 首先,輸入字串 scanf s ch 1 n strlen ch 1 然後,按照題意 suffix sort ch for int i 1 i n ...

字尾陣列學習筆記

要用好字尾陣列要先理解裡面幾個陣列的概念 sa i 表示字典序第i大的字尾下標 字典序排名依次是1?len string rank i 表示下標為i的字尾字典序排名 height i 表示sa i 和sa i?1 最長公共字首的長度.乙個性質 lcp suffix i suffix j min ra...