01 字典樹模板 求XOR最大值

2021-08-04 00:08:49 字數 823 閱讀 5073

大致題目: 有一n個數, 給定一些詢問, 每次詢問乙個數, 問這n個數中與詢問的這個數xor起來最大的那個數是多少. 或者與這n個數中異或起來的最大值是多少…… 等等…. (相當於求取兩個數異或起來的最大值是多少, 這樣就可以暴力乙個, 01字典樹找另外乙個)

思想: 主要是從乙個二進位制位上面去考慮這個問題, 因為兩個數異或起來要盡量的大, 那麼肯定肯定異或的對應位置盡量是相反的, 即0 盡量和 1在一起, 1盡量和0一起, 那麼我們就可以通過這n個數建立一顆01字典樹,然後讓詢問的數在上面進行匹配, 並且利用貪心的思想, 從最高位開始建樹……

這個是模板, 帶刪除的. 基本上都適用.

帶刪除的01字典樹, 其實就是增加了乙個計數器, 刪掉這個節點其實就是將這個節點處的計數器–, 在詢問的時候, 判一下是否這個計數器是否大於零就是了.

測試題目 cf 706 d

const

int maxn = 5e6+5; // 注意一點, 範圍要盡量大點, 否則很容易re

const

int siz = 33;

int n, m;

struct trie trie[maxn];

int idx;

void build(int n)

trie[x].val = n; //把路的終點設定成該條路是那個數的.

}int query(int n)

return trie[x].val; //返回走的那條路的終點的值.

}void del(int n)

}void solve()

}

另一道題目 hdu 4825

01字典樹模板

題意 輸入n n次操作 x 插入x x 刪除x x 查詢已經插入的某個數與x異或的最大異或和思路 01字典樹模板題 遇到這題剛好可以更新一下自己的模板 以前的太醜了 ps 這題有個坑點是字典樹為空的情況下可能會查詢,所以開始的時候先插入乙個0 code include using namespace...

COJ 1216 異或最大值 01字典樹

題意 求n個非負數中任意2個的異或值的最大值。n數量級為10 5 分析 直接暴力肯定超時了。乙個非負整數可以看成1個32位的01字串,n個數可以看成n個字串,因此可以建立字典樹,建好樹後,對於任意非負整數x,可以沿著樹根往下貪心找到y,使得x異或y最大,複雜度為樹的深度。view code incl...

01字典樹 求序列完美度 求區間最大異或值

解題關鍵 01字典樹模板,用字典樹儲存每個數的二進位制表示,從而動態維護區間上的最大異或值,注意新增和刪除都可以用於乙個change函式表示。複雜度 o n log n log n 1 include2 define maxn 1005 3 define inf 0x3f3f3f3f 4using ...