声明
本文资料参考acwing算法基础课
地址:https://www.acwing.com
概述
- 解决问题:求一些数字最大异或对
- 平均时间复杂度为O(n),暴力为O(n^2)
模板记忆
这个模板和trie一样,不用单独记忆
模板代码
int son[N][2] = {}, idx; // 用trie树存储二进制数字
int insert(int x)
{
int p = 0, q = 0, res = 0; // p用于插入,q用于查找最大异或对,res记录最大异或对
for (int i = 30; i >= 0; i --) // 从高位遍历到低位,一共有31位,则最高位需要右移30位
{
int u = x >> i & 1; // u得到对应位
if (!son[p][u]) son[p][u] = ++ idx; // 查找,没有对应分支则添加
p = son[p][u]; // 修改平台
if (son[q][!u]) q = son[q][!u], res += 1 << i; // 如果存在异或支路则加上此数
else q = son[q][u]; // 否则走非异或支路
}
return res; // 返回记录值
}