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