Trie 可持久化Trie

2022-03-31 15:52:34 字數 2575 閱讀 7026

warning:以下**未經測試,若發現錯誤,歡迎指出qwq~

一種簡單的資料結構,可儲存大量字串,可在$o(len)$的時間內完成插入,刪除,查詢等操作。

下面是乙個簡單的例子,對於abc,abd,abcd,bcd這四個字串建trie樹,如下圖:

其中,紅色節點為乙個字串的結尾。對於任意節點,從根節點到該節點路徑上字元組成的字串即為該節點表示的字串。

相關變數

1

int root,cnt,ch[1000010][26],son[1000010];2

bool flag[1000010];3

void

init()

root即為根節點,cnt用於動態建樹,ch[i][j]表示i節點的第j個子節點(表示字元char('a'+i))的編號,son[i]表示i節點的子節點數,flag[i]表示i節點是否為某個字串的末尾。

插入

1

void ins(int rt,int

dep)

6if(!ch[rt][s[dep]-'a'

])10 ins(ch[rt][s[dep]-'

a'],dep+1

);11

return

;12 }

刪除

1

bool del(int rt,int

dep)

7return

false;8

}9if(!ch[rt][s[dep]-'a'

])10

return

false;11

if(del(ch[rt][s[dep]-'

a'],dep+1

))16

return

true;17

}18return

false

;19 }

查詢

1

bool query(int rt,int

dep)

以上三個是trie樹的基本操作,下面來講一下trie樹的其它運用。

求第k小字串

儲存以每個節點為根的子樹中的末尾節點個數(size[i])即可。

1

void kth(int rt,int dep,intk)6

for(int i=0;i<26;i++)

7if(k>size[ch[rt][i]])

8 k-=size[ch[rt][i]];

9else

if(ch[rt][i])

13return

;14 }

最長公共字首

用lca求兩個字串對應的末尾節點的最近公共祖先即可,時間複雜度o(log2n)。

1 **不貼了,懶~~~

最大異或值

將每個數轉化為二進位制,新增字首0至相同位數,然後從最高位開始插入。查詢時從最高位開始查詢是否有與相應位置異或值為1的節點即可。

1 太水了,也不貼**了~~~

在做題過程中,我們常常會遇到求區間第k大字串,區間與某數異或最大值之內的問題,我們便可以採用可持久化trie樹來解決這類問題。

依舊以abc,abd,abcd,bcd這四個字串為例建可持久化trie,如下圖:

紅色節點意義同上。

相關變數

1

int cnt=0,root[1000010],size[1000010],ch[1000010][26];2

bool flag[1000010];3

void

init()

意義同上。

插入

1

void ins(int &now,int last,int

dep)

9int sign=s[dep]-'a'

;10for(int i=0;i<26;i++)

11if(i!=sign)

15 ins(ch[now][sign],ch[last][sign],dep+1

);16 size[now]+=size[ch[now][sign]];

17return

;18 }

區間第k小查詢

1

void kth(int rl,int rr,int dep,intk)6

for(int i=0;i<26;i++)

7if(k>size[ch[rr][i]]-size[ch[rl][i]])

8 k-=size[ch[rr][i]]-size[ch[rl][i]];

9else

if(size[ch[rr][i]]-size[ch[rl][i]]>0)14

return

;15 }

區間最大異或值

1 好吧,還是懶得打~~~

可持久化trie

可持久化trie樹 給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。q l r x 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p a p 1 a n x最大,輸出最大是多少。solution 異或滿足...

可持久化trie樹

腦補出來的乙個東西,不知道別人是怎麼實現的 自己也還沒有用寫的 交過題 不過把想法和大佬說了,應該是正確的。乙個數列,每次查詢 l,r 內的數中取乙個數和給定值xor後的最大值。如果沒有區間限制,那麼直接將所有數都插入trie樹就可以了,但是這裡需要指定區間的,所以不能直接處理。因此對於trie樹上...

Trie樹 可持久化

made by xiper updata time 2015 12 8 test status 使用前呼叫初始化函式 init 同時 root 0 0 struct trie persistent tree triesize 獲取字符集雜湊編號 必須在 0 lettersize 之內 inline ...