初試01字典樹(求異或問題)

2021-08-01 13:03:16 字數 1026 閱讀 2802

題目鏈結

一般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...