在给定的 NN 个整数 A1,A2……ANA1,A2……AN 中选出两个进行 xorxor(异或)运算,得到的结果最大是多少?
第一行输入一个整数 NN。
第二行输入 NN 个整数 A1A1~ANAN。
输出一个整数表示答案。
1≤N≤1051≤N≤105,
0≤Ai<2310≤Ai<231
- 3
- 1 2 3
3
- #include
- #include
-
- using namespace std;
-
- const int N=100010,M=31*N;
- int n;
- int a[N],son[M][2],idx;
-
- void insert(int x)
- {
- int p=0;
- for(int i=30;i>=0;i--)
- {
- int &s=son[p][x>>i&1];
- if(!s) s=++idx;
- p=s;
- }
- }
-
- int search(int x)
- {
- int p=0,res=0;
- for(int i=30;i>=0;i--)
- {
- int s=x>>i&1;
- if(son[p][!s])
- {
- res+=1<
- p=son[p][!s];
- }
- else p=son[p][s];
- }
- return res;
- }
-
- int main()
- {
- scanf("%d",&n);
- for(int i=0;i
- {
- scanf("%d",&a[i]);
- insert(a[i]);
- }
-
- int res=0;
- for(int i=0;i
- {
- res=max(res,search(a[i]));
- }
-
- printf("%d\n",res);
- return 0;
- }
今天下午暗下决心做三个题目,结果发现做这一个题目就已经非常吃力了。这个题目其实暑假的时候就已经看了题解,早几天看了讲解视频,还是有一些一知半解的。
主要的思路是建立一个trie树,然后异或运算是不进位加法,意思就是说,一个数字用二进制方法来表示,如果对应数位上的数字不相同,结果就是1,如果两个数字相同,结果就是0。
我们先把输入的数字使用二进制来进行表示,二进制表示使用算术右移和&运算来进行实现。
x>>i&1
我们知道,数位越高,对数字的影响越大,所以我们从最高位开始考虑问题。
insert函数是用来建立一个trie树的
search函数是用来寻找当前数字的最大的异或数值
假设我们现在数位是1,我们需要的数字就是0,我们选择有0的数字去进行异或运算,如果没有0,我们再去考虑其他情况,有点像是有很多数字可以供选择,我们选择一个满足条件的最优解
res+=1<
这一行是进制的知识,就是把分散的数字归整成为一个十进制数字,可能会成为最后的答案数值
-
相关阅读:
P1045 [NOIP2003 普及组] 麦森数 python 题解
2022柏林葡萄酒大奖赛 | 瑞格尔侯爵佳酿斩获两枚金奖
【软件测试及质量保证】小结
『大模型笔记』RAG 系统开发中的12大痛点及解决方案
【数据结构】反射、枚举
[思维]Party Codeforces1711B
分析:Nomad Bridge黑客攻击的独特之处
QT连接数据库
java基于Springboot+vue的零食销售商城网站 elementui
21天学习挑战:经典算法---算法概念引入
-
原文地址:https://blog.csdn.net/L3102250566/article/details/133364632
-
最新文章
-
【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
Halo插件:支持GitHub的图床附件策略
电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
软件更好写之后口碑会更重要
大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
Java标签跳转:一个鲜为人知但却很实用的小技巧
多智能体系统论文速读