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