刷刷书上的例题

在给定的N个整数A1,A2……An中选出两个进行XOR运算,得到的结果最大是多少?N<=105,0<=Ai<231

SOlution:

我们思考到对于两个数相异或,是先将两数转为二进制数,然后比较同一位上不同为1否则为0,然后观察题目发现每个数的二进制不会超过31位,那么容易想到直接将每个数转为31位二进制存储(不足的补0),于是可以构建一颗Trie树。然后考虑对于每一个数,都在数列中找到一个数使其相异或值最大,我们将查询的这个数也转为31位二进制,贪心的想到从后往前扫,尽量使同一位上的数不同,实在没有节点时就走相同的,若没有节点了就用当前的异或值与ans比较,枚举n个数的情况。最后输出ans就OK了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int N=;
int trie[N][],tot,n,a[N];
il int gi()
{
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
il void insert(int x)
{
int p=;
for(int k=;k>=;k--){
int c=(x>>k)&;
if(!trie[p][c])trie[p][c]=++tot;
p=trie[p][c];
}
}
il int getans(int x)
{
int p=,v=,ans=;
for(int k=;k>=;k--){
int c=(x>>k)&,o=c?:;
if(trie[v][o])v=trie[v][o],ans=(ans<<)|;
else v=trie[v][c],ans<<=;
p=trie[p][c];
}
return ans;
}
int main()
{
n=gi();
int ans=;
for(int i=;i<=n;i++)a[i]=gi(),insert(a[i]);
for(int i=;i<=n;i++){
ans=max(ans,getans(a[i]));
}
printf("%d\n",ans);
return ;
}

最新文章

  1. mysql 优化
  2. 淘宝购物车页面 智能搜索框Ajax异步加载数据
  3. Winform绑定数据源的几种方式?
  4. Apache axis2 + Eclipse 开发 WebService
  5. Hadoop - Zeppelin 使用心得
  6. ArrayList和Hashtable
  7. Android开发——实现固定在ScrollView顶部的View,类似于新浪微博的评论列表的顶部
  8. 为Angular-UEditor增加工具栏属性
  9. Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
  10. java -- 对Map按键排序、按值排序
  11. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)
  12. zabbix3.2监控mysql
  13. oneinstack 另一个 lnmp环境一键安装工具
  14. C# DataAdapter.Update() 无法更新数据表中删除的数据行
  15. iOS 覆盖率检测原理与增量代码测试覆盖率工具实现
  16. Python学习---重点模块的学习【all】
  17. 【leetcode 简单】第三十二题 买卖股票的最佳时机Ⅱ
  18. 笨办法学Python(四十一)
  19. Linux 下打包报错:enospc (no space left on device)
  20. django+xadmin在线教育平台(三)

热门文章

  1. Spring常见面试题
  2. MetInfo最新网站漏洞如何修复以及网站安全防护
  3. Electronic Devices【电子设备】
  4. 用filter()筛选出素数
  5. git的基本操作总结
  6. 洛谷(P1006 传纸条)
  7. springmvc 配置多视图(jsp,freemarker,HTML等)
  8. 初步学习pg_control文件之六
  9. ACE Reactor 源码解析
  10. Sumsets 递推