异或

1 线性基

不会。

2 字典树

用 Trie 解决 xor 的核心思想就是:贪心地选相反的一位。下面通过题目说明。

2-1 超水例题

题意

给你 \(n\) 个数 \(a_i\),\(T\) 次询问,每次询问一个数 \(x\),求选取一个 \(a_i\) 使 \(a_i \text{\ xor\ }x\) 最大是多少。

\(n,T\le 10^5,a_i\le 2^{30}\)。

题解

首先是插入。

我们把 \(a_i\)​​ 拆分成二进制,从高位到低位插入进 01字典树 中。比如一个数二进制为 1010,则:

X---1---2---3---4
  1   0   1   0

差不多这个意思……

在每个叶子节点我们设 \(w_i\)​,为根到此叶子代表的数字是什么。显然插入到结尾的时候顺便放入赋值就行了。

再下是查询。

对于 \(x\)​ 拆分成的二进制,从高到低把它放在字典树中,到了第 \(d\) 层的某一点,如果 \(x\) 二进制从高到低的位是 1,则走此点的 0 儿子;如果位是 0,则走此点的 1 儿子。(当然,如果此点只有一个儿子,就只能走这个儿子了)

最后走到叶子节点,则答案就是 \(x\ \text{xor}\ w_i\) 啦。

2-2 最大异或和

链接,题意略。

建立可持久化字典树,云云。

2-3 异或粽子

略。

上一篇:AT4142 [ARC098B] Xor Sum 2(尺取法)


下一篇:【线段树维护区间异或】codeforces E. XOR on Segment