定义
0-1字典树
0-1字典树(0-1 Trie)是一中特殊的字典树,用来表示二进制串,其中每个节点最多有0和1两个子节点。
利用其结构可以高效的求得一个数与树中的数的最大异或值。
删除
对于删除,我们当然不能把该数二进制位的所有节点删除,因为这些节点可能也被其他数所使用。所以需要加一个数组,表示有多少个数使用了节点。插入时使各位+1,删除时只需要各位-1,说明该节点存在。
实现
constexpr int N = 1e6;
constexpr int BITS = 30;
int trie[N * BITS][2];
int cnt[N * BITS];
int total = 1;
void insert(int x)
{
int u = 1;
cnt[u]++; // 每个都经过根节点
for (int i = BITS; i >= 0; i--)
{
int bit = (x >> i) & 1;
if (trie[u][bit] == 0)
trie[u][bit] = ++total;
u = trie[u][bit];
cnt[u]++;
}
}
void remove(int x)
{
int u = 1;
cnt[u]--;
for (int i = BITS; i >= 0; i--)
{
int bit = (x >> i) & 1;
u = trie[u][bit];
cnt[u]--;
}
}
int query_max_xor(int x)
{
int res = 0;
int u = 1;
for (int i = BITS; i >= 0; i--)
{
int bit = (x >> i) & 1;
if (trie[u][bit ^ 1] && cnt[trie[u][bit ^ 1]] > 0) // 优先走不同的位
{
res |= (1 << i);
u = trie[u][bit ^ 1];
}
else
u = trie[u][bit];
}
return res;
}