题意
给定一个数组和M组询问,每组询问输出一下这个数和数组里的元素 异或的最大值。
题解
题目连接
先将数字转化成二进制, 再从高位到低位插入
注意每次异或最大值的时候, 先将这个数异或 (2^32)-1 成为理论上的最大异或值, 然后在字典树里查找最接近这个理论最大异或值的数, 查找的时候优先取与上个结点不同的二进制数字
代码
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
const int MAXN = 3e6+10;
int tr[MAXN][2], tot = 0;
ll two[32+1];
//其中如果当前位是0,则加左儿子,否则加右儿子,即这棵树中左儿子表示0,右儿子表示1
void add ( ll num ) {
rg int rt = 0, id;
for ( int i =