Trie上的字尾陣列

2021-08-23 14:36:26 字數 1091 閱讀 6272

亦稱為廣義字尾陣列

lcs=longest common suffix

lcp=longest common preffix sv

s

v表示trie上節點v到根的路徑形成的字串

由於在trie上,自帶去重功能 顯然l

cs(s

u,sv

)=de

plca

(u,v

) lcs

(su,

sv)=

depl

ca(u

,v

)我們要實現字尾陣列的功能,即把sa

,ran

k,h(

heig

ht) sa,

rank

,h(h

eigh

t)

都求出來 sa

,ran

k sa,

rank

很好求,模擬序列情形,倍增,將兩個長度2i

−12 i−

1的資訊雙關鍵字排序得到2i

2

i長度的資訊。這裡,我們只需取出每個點的2i

−12 i−

1級祖先。

其餘部分類似於序列上的做法。

然後我們要茲磁查詢lc

p(su

,sv)

l cp

(su,

sv

)乙個思路是求出hi

h

i,即lc

p(ss

ai−1

,ssa

i)l cp

(ssa

i−1,

ssai

)乙個方法是二分+雜湊,但是有更簡單的做法,我們對倍增過程每個點的ra

nkr an

k保留下來(據說這叫波蘭表),那麼我們可以倍增求任意兩個點的lc

p lcp

,**大概長這樣

int lcp(int u , int v) 

return l;

}

然後類似地,使用st表支援rmq即可o(1)詢問任意兩點lcp

trie上構建字尾陣列

往事太多,有時候忘了就忘了吧。如果有非記不可的,就只能用點附加手段啦 我們定義一棵往事樹是乙個 n 個點 n 1 條邊的有向無環圖,點編號為 1到 n,其中 1 號點被稱為是根結點,除根結點以外,每個點都恰有一條出邊 即以其作為起點的邊 每條邊上有 1 個字元 這裡我們實際上用乙個不大於 300的非...

trie上構建字尾陣列

往事太多,有時候忘了就忘了吧。如果有非記不可的,就只能用點附加手段啦 我們定義一棵往事樹是乙個 n 個點 n 1 條邊的有向無環圖,點編號為 1到 n,其中 1 號點被稱為是根結點,除根結點以外,每個點都恰有一條出邊 即以其作為起點的邊 每條邊上有 1 個字元 這裡我們實際上用乙個不大於 300的非...

CH601字尾陣列 Trie樹

內含字典樹建立及查詢模板 描述給定n個字串s1,s2.sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn中有多少個字串是t的字首。輸入字串的總長度不超過10 6,僅包含小寫字母。輸入格式 第一行兩個整數n,m。接下來n行每行乙個字串si。接下來m行每行乙個字串表示詢問。輸出格式 對於每個...