給定乙個字串s,按字典序排序s的所有子串
鬼知道什麼思想,好像沒有什麼思想。哦,想起來了,是倍增。
考慮最簡單的字尾間o(
n)o (n
)比較和快排o(
nlog
n)o (n
logn
),總複雜度o(
n2lo
gn) o(n
2log
n)
。考慮優化字串間的比較,用倍增的思想,假設k/
2 k/2
長度的已經比完了,比較長度為
k k
的字串(長度不足補
0' role="presentation">0
0)只要比前k/
2 k/2
段再比較後k/
2 k/2
段,也就是把字串當做乙個二元組做雙關鍵字排序,其中k≪=
1 k≪=1
。這樣複雜度是o(
nlog
2n) o(n
log2
n)
的。考慮到我們是對字串排序,字串長度為
n n
,則每個值的種類最多
n' role="presentation">n
n種,所以可以用基數排序。於是複雜度來到o(
nlog
n)o (n
logn
)。
詳見**,細節太多
清爽版void qsort()
}}
void qsort()
}}
SA 字尾陣列
首先一定要確定sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i的排名是多少,那個是ra nk i 當然啦 最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接so rt一下 這樣的複雜度是o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所有元素...
字尾陣列SA
原理 其本質就是把字串的所有字尾進行排序。用普通排序需要o nlogn 但是字串比較和數字比較不同,所以實際需要o n nlogn 為了讓這個過程快一點,所以有了倍增演算法,o nlogn 和dc3演算法,o n 倍增演算法比較簡單,也比較好寫,具體可以參考這個大佬的部落格。dc3演算法複雜一點,但...
SA 字尾陣列
首先一定要確定 sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i 的排名是多少,那個是 rank i 當然啦最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接 sort 一下 這樣的複雜度是 o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所...