题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472

题目描述:在给定的 N 个整数中选出两个进行异或运算,求得到的结果最大是多少。

看到这道题要搞异或,首先想到把它们转成二进制。

那用什么存呢?

这就要用到一个比较NB的算法——字典树了。

(对字典树不太了解的可以先看我另一篇博客——https://www.cnblogs.com/wdrdsahudhisjabshdahuhsh/p/16323517.html)

这就是把一堆整数转成2进制数,再存到字典树里,并用字典树查找最大结果。

(ps:异或就是二进制中当两个值不相同时返回1,否则返回0)

上代码(有注释):

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int a,trie[4000001][2],tot=0;
4 void in(int a){//转成二进制并存入字典树
5 int root=0,id;
6 for(int i=30;i>=0;i--){//从最高位开始
7 id=(a>>i)&1;//提取a在二进制中第i位的值
8 if(trie[root][id]==0){
9 trie[root][id]=++tot;
10 }
11 root=trie[root][id];//字典树
12 }
13 }
14 int out(int a){
15 int root=0,id,ans=0;
16 for(int i=30;i>=0;i--){
17 id=(a>>i)&1;
18 if(trie[root][!id]){//找到不同的值了
19 ans=ans|(1<<i);//加上异或这一位的值
20 root=trie[root][!id];//换节点继续查
21 }else{
22 root=trie[root][id];//直接往下走
23 }
24 }
25 return ans;
26 }
27 int main(){
28 int n,ans=0;
29 cin>>n;
30 while(n--){
31 cin>>a;
32 in(a);
33 ans=max(ans,out(a));//求最大值
34 }
35 cout<<ans;//完事
36 }

最新文章

  1. 非阻塞/异步(epoll) openssl
  2. Windows环境下vscode-go安装笔记
  3. .net 之缓存
  4. ( 转)UVM验证方法学之一验证平台
  5. 关于thinkphp 中的字段自动检查机制
  6. PHP event 事件机制
  7. hdfs工作原理
  8. C#中SaveFileDialog 和OpenFileDialog 的用法
  9. php中global和$GLOBALS[]的分析之一
  10. 2016022612 - redis事务命令集合
  11. X窗口系统名词解释
  12. 快速构建Windows 8风格应用31-构建磁贴
  13. 读《不要告诉我你懂margin(海玉的博客)》有感
  14. Maven搭建SpringMVC+MyBatis+Json项目(多模块项目)
  15. centos 设置中文
  16. echarts 自定义主题
  17. Flask常用的钩子函数
  18. poj 3041(最大匹配问题)
  19. ps中的栅格化--引出--矢量图
  20. 实战 Lucene2.0

热门文章

  1. java中接口interface可以持有多个类的共享常量
  2. Node自动重启工具 nodemon
  3. [ Skill ] map mapc mapcan mapcar mapcon maplist mapinto
  4. 利用 onnxruntime 库同时推理多个模型的效率研究
  5. linux修改静态ip
  6. 汇编语言实验1—Debug基础操作
  7. 1.Docker容器学习之新生入门必备基础知识
  8. B. Lord of the Values 思维数学建构 附加 英文翻译
  9. unity 编辑器扩展简单入门
  10. MQ系列:消息中间件执行原理