題目鏈結
一般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]
在查詢最大異或值時我們用貪心的策略,比如我們在字典樹中查詢10101的最大異或值。
我們從最高位即第5位開始查(我省略掉前面的0位),由於第5位是1(對於其它的任意數,我們設為idx),之後看字典樹中有沒有第5為是1^1(idx^1)的數,如果有就進入0(idx^1)的節點(貪心思想,即首先保證該位異或後值為1,使異或值盡可能大),沒有就進入1(idx)節點,然後從高位到低位依次這樣即可。
題意:求n個數中最大異或和值的區間。有多個答案區間按字典序輸出。
題解:把1-n的所有字首異或和插入01字典樹,然後按區間異或的性質掃一遍就可以了。複雜度(n*32(字典樹深度))
#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef pairp;
const int inf=0x3f3f3f3f;
int n,num,ans,l,r,cnt;
int ch[1000003*32][2];
int idx[1000003*32];//記錄字典序
void init()
void insert(int id,int x)
k=ch[k][tmp];
}if(id=0;i--)
else if(res==ans)
return 0;
}
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字典樹)
題意 讓你找乙個連續區間異或和最大,如果有相同的,則輸出斷點較小的。題解 01字典樹,利用字首和的思想進行求解,我們在插入字首的同時,也在不斷的更新最大值。我們查詢當前 二進位制字串與已經插入的 二進位制字串中的哪乙個異或和最大?找到最大的那個,讀取這個字首和是到誰結束的,來判斷是否要更新 keep...
HDU6059(01字典樹求異或最大值)
題意 求a中 三個數a i,aj ak,ai a j ak i j這裡要動態維護字典樹,每當輸入乙個數,就更新一下字典樹。最後減去i j的情況 這裡最難懂 搞了好久,算是會了,手撕 時問題百出,還是沒有學到骨子裡,留下以後在複習。參看了兩位大佬的部落格 大佬部落格 小老部落格 include inc...