為了做13年南京網路賽的一道題 學了這個01字典樹
看了別人的模板 之後切了幾道水題
現在總結一下
01字典樹的實現可以看成是把乙個數的二進位制字元化後插入到一顆一般的字典樹中
比如在01字典樹種插入3時 相當於在字典樹中插入00 …..00011(一共33為,這個根據具體實現不同)
查詢最大異或值的時候我們是從最高位 向下貪心查詢 貪心策略為:當前查詢第k位 二進位制數字idx 如果存在idx ^ 1的節點 我們就進入這個節點 否則進入idx節點
貪心策略的證明: 如果這時我們進入了第k位為idx 的節點 那麼 第k位為idx ^ 1 的節點組成的數 異或x一定更大
最後關於01字典樹的使用:
不用關心**內部是如何實現的
只將01字典樹看做是乙個數集 我們可以在這個集合中查詢和x異或最大的元素
應用:
經常有區間異或和的題目:比如求[l,r]的異或和
由x xor x = 0 ; 0 xor y = y;所有【l,r】 = 【1,r】 xor 【1,l - 1】
這樣在一顆加入了r 前的所有字首異或和的01字典樹上查詢【1,r】就能得到以r為右邊界的最大異或和
模板:
const
int maxn = 100000 + 5; //集合中的數字個數
typedef
long
long ll;
int ch[32 * maxn][2]; //節點的邊資訊
ll value[32 * maxn]; //節點儲存的值
int node_cnt; //樹中當前節點個數
inline
void init()
inline
void insert(ll x)
cur = ch[cur][idx];
}value[cur] = x; //最後的節點插入value
}inline ll query(ll x)
return value[cur];
}
字典樹 與 01字典樹
字典樹可以降低空間複雜度 01字典樹可以降低時間複雜度。字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較...
01字典樹 OR問題
01字典樹 用途 解決區間異或和之類的問題 異或的性質 1.交換律 2.結合律,即 a b c a b c 3.自反性,即x x 0 4.x 0 x 有上述性質,對於區間異或和要知道此性質xor l,r xor 1,l 1 xor 1,r 注意 int型別1 31會溢位 區間異或和的題目 比如給一組...
01字典樹模板
題意 輸入n n次操作 x 插入x x 刪除x x 查詢已經插入的某個數與x異或的最大異或和思路 01字典樹模板題 遇到這題剛好可以更新一下自己的模板 以前的太醜了 ps 這題有個坑點是字典樹為空的情況下可能會查詢,所以開始的時候先插入乙個0 code include using namespace...