warning:以下**未經測試,若發現錯誤,歡迎指出qwq~
一種簡單的資料結構,可儲存大量字串,可在$o(len)$的時間內完成插入,刪除,查詢等操作。
下面是乙個簡單的例子,對於abc,abd,abcd,bcd這四個字串建trie樹,如下圖:
其中,紅色節點為乙個字串的結尾。對於任意節點,從根節點到該節點路徑上字元組成的字串即為該節點表示的字串。
相關變數
1root即為根節點,cnt用於動態建樹,ch[i][j]表示i節點的第j個子節點(表示字元char('a'+i))的編號,son[i]表示i節點的子節點數,flag[i]表示i節點是否為某個字串的末尾。int root,cnt,ch[1000010][26],son[1000010];2
bool flag[1000010];3
void
init()
插入
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以上三個是trie樹的基本操作,下面來講一下trie樹的其它運用。bool query(int rt,int
dep)
求第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區間第k小查詢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 }
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 ...