当前位置: 首页 > news >正文

【AcWing 143题解】最大异或对

AcWing 143. 最大异或对
【题目描述】
在这里插入图片描述
在查看解析之前,先给自己一点时间思考哦!
天津之眼
【题解】
本题要求给定一个整数序列,找出其中任意两个数进行异或运算后,结果的最大值是多少。由于数据规模较大,我们不能简单地通过两层循环直接遍历所有组合,这样的时间复杂度会达到O(n2)O(n^2)O(n2),超出了时间限制。
我们可以利用Trie树来高效解决这个问题。通过使用前缀树,我们能够将每个整数拆分成二进制形式,按照其二进制位插入树中,然后在查询时可以通过比较来找到最大可能的异或值。

关键点:
异或性质:我们要最大化的是两个数的异或值,而异或的性质决定了异或值越大,二者的对应位越不相同。因此,在查询时,我们会尽量选择不同的位进行匹配。
Trie 树结构:每个节点代表一个二进制位(0 或 1)。从根节点开始,每个数按位插入,如果当前数的某一位是 1,那么它就沿着该位的路径插入树中。
查询最大异或值:当我们要查询一个数的最大异或值时,从当前数的二进制表示的每一位开始,尽量沿着与当前位不同的路径走。

实现步骤:
将每个数的二进制位逐位插入到 Trie 树中。
在插入每个数的同时,查询当前数和 Trie 树中已有数的最大异或值,并更新最大异或值。
【参考代码】

#include <iostream>
using namespace std;// 最大节点数和最大Trie树的容量
const int N = 1e5 + 10, M = 31 * N;  
// son[i][0/1] 表示节点 i 的左/右子节点,a 存储输入的数,idx 用来给每个节点编号
int son[M][2], a[N], idx;  // 插入一个数到 Trie 树
void insert(int x) {int p = 0;// 从高位到低位插入数的二进制位for(int i = 30; i >= 0; i--) {int u = x >> i & 1;  // 获取当前二进制位if(!son[p][u])  // 如果该路径没有节点,则创建新节点son[p][u] = ++idx;p = son[p][u];  // 移动到下一个节点}
}// 查询当前数与树中已有数的最大异或值
int query(int x) {int p = 0, res = 0;  // p 为当前节点,res 为当前异或结果// 从高位到低位查询最大异或值for(int i = 30; i >= 0; i--) {int u = x >> i & 1;  // 获取当前二进制位// 尝试选择与当前位不同的路径,以得到更大的异或值if(son[p][!u]) {p = son[p][!u];res = res * 2 + !u;} else {p = son[p][u];res = res * 2 + u;}}return res; 
}int main() {int n;cin >> n;  for(int i = 0; i < n; i++)cin >> a[i];  int res = 0;  // 用来存储最大异或值for(int i = 0; i < n; i++) {insert(a[i]);  // 将当前数插入到 Trie 树int t = query(a[i]);  // 查询当前数的最大异或值res = max(res, a[i] ^ t);  // 更新最大异或值}cout << res << endl;  return 0;
}
http://www.xdnf.cn/news/1189441.html

相关文章:

  • Item14:在资源管理类中小心拷贝行为
  • 高并发微服务限流算法方案对比与实践指南
  • xLua和C#交互
  • 激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定
  • 字节跳动扣子 Coze 宣布开源:采用 Apache 2.0 许可证,支持商用
  • 6.数组和字符串
  • J2EE模式---表现层集成模式
  • 备份一下我的 mac mini 的环境变量配置情况
  • net-snmp添加自定义mib树
  • 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
  • 详解力扣高频SQL50题之619. 只出现一次的最大数字【简单】
  • PCIe 的L状态(链路状态)和D状态(设备状态)
  • 前端组件梳理
  • 【WPF】NumericUpDown的用法
  • 【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php
  • 教育培训系统源码解析:如何打造高可扩展的在线学习平台?
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • Android Studio 提示信息 ‘equals(““)‘ can be replaced with ‘isEmpty()‘
  • 《Java 程序设计》第 6 章 - 字符串
  • VTK交互——Callback
  • NLua和C#交互
  • 访问者模式感悟
  • 泰山派GPIO编译 ADB下载 万用表测量GPIO电压
  • 【ELasticsearch】节点角色分类与作用解析
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • AI 编程工具 Trae 重要的升级。。。
  • 经典IDE之Turbo C
  • nginx的 `root` 和 `alias` 笔记250726
  • 0.深度学习环境配置步骤