【LOJ 10050】The XOR Largest Pair
【题目】
传送门
题目描述:
在给定的 n n n个整数 a 1 a_1 a1, a 2 a_2 a2…… a n a_n an 中选出两个进行 x o r xor xor 运算,得到的结果最大是多少?
输入格式:
第一行一个整数 n n n,第二行 n n n 个整数 a 1 a_1 a1~ a n a_n an。
输出格式:
一个整数表示答案。
样例数据:
输入
3
1 2 3
输出
3
数据范围与约定:
对于 100% 的数据: n n n ≤ 1 0 5 10^5 105, 0 0 0 ≤ a i a_i ai < 2 31 2^{31} 231。
【分析】
首先说一下异或吧,对于异或,是先把要进行计算的数转换成二进制数,然后按位比较,相同为 0 0 0,不同为 1 1 1
为了使最后的结果最大,我们就尽量想让最后答案的两个数中各个位上的数不同,并且尽量让答案的高位为 1 1 1(想想 1000 1000 1000 肯定比 0111 0111 0111 优)
这个时候我们神奇的Trie树就闪亮登场了
我们对每个数按照二进制位来建立 t r i e trie trie 树;建完之后,枚举每个数,在 t r i e trie trie 树上跑,每次都尽量跑相反的路(就是如果当前为 1 1 1 就尽量跑 0 0 0,当前为 0 0 0 就尽量跑 1 1 1),如果不能跑最相反的就只能跑相同的
在代码中我是先找出在原序列中与 a i a_i ai 异或值最大的那个数,还需要再异或一下才是答案(当然直接找答案也是可行的)
最后对每个答案取最大值就可以了
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
int t,a[N];
struct Trie
{int son[2];
}tree[N<<5];
void build(int x)
{int i,k,p=0;for(i=30;~i;--i){k=(x>>i&1)?1:0;if(tree[p].son[k]==0)tree[p].son[k]=++t;p=tree[p].son[k];}
}
int find(int x)
{int i,k,s,p=0,ans=0;for(i=30;~i;--i){k=(x>>i&1)?0:1;s=(tree[p].son[k])?k:k^1;p=tree[p].son[s];if(s) ans|=(1<<i);}return ans;
}
int main()
{int n,i,x,Max=0;scanf("%d",&n);for(i=1;i<=n;++i){scanf("%d",&a[i]);build(a[i]);}for(i=1;i<=n;++i)Max=max(Max,a[i]^find(a[i]));printf("%d",Max);return 0;
}
【LOJ 10050】The XOR Largest Pair相关推荐
- 【LOJ 10050】The XOR Largest Pair【Trie】
题目大意: 题目链接:https://loj.ac/problem/10050 求一个数列中的任意两个数字亦或的最大值. 思路: 如果给出一个数字,求一个不比它位数大的数使得这两个数亦或的值最大,那么 ...
- 【LOJ10050】The XOR Largest Pair(字典树)
problem 给定n个整数,在其中任意选出两个进行xor运算,得到的结果最大值是多少? n<1e5,ai在int范围内 solution 朴素枚举,O(n^2), TLE 考虑异或运算,相同为 ...
- 数据结构总结1(火车进栈/兔子与兔子/括号画家/Editor/邻值查找/最大子序和/前缀统计/Phone List/The XOR Largest Pair)
问题 A: 火车进栈 题目描述 这里有n列火车将要进站再出站-- 但是,每列火车只有1节-那就是车头-- 描述 有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个 ...
- 【LOJ#6682】梦中的数论(min_25筛)
[LOJ#6682]梦中的数论 https://www.cnblogs.com/cjyyb/p/11178395.html 利用min_25筛,求解约数个数函数平方的前缀和.
- 【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)
[LOJ#572]Misaka Network 与求和 https://www.cnblogs.com/cjyyb/p/10170630.html 看到次大质因子就可以想到是min_25筛了,然后只需 ...
- 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
[LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...
- 【LOJ#573】【LNR#2】单枪匹马(线段树)
[LOJ#573][LNR#2]单枪匹马(线段树) 题面 LOJ 题解 考虑拿线段树维护这个值,现在的问题就是左右怎么合并,那么就假设最右侧进来的那个分数是\(\frac{x}{y}\)的形式,那么就 ...
- The XOR Largest Pair(算法竞赛进阶指南 P72,Trie)
一.题目链接: The XOR Largest Pair 二.题目大意: 有 n 个数,求任意两个数异或得到的最大值. 三.分析: 刚学习了字典树,觉得还不错. 把每个数分解为二进制存到字典树中,查询 ...
- 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)
[LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...
最新文章
- form表单序列化去除空值
- LINUX下查看主机信息
- centos7 安装配置mesos+marathon+zookeeper
- 理解Promise (3)
- 测试软件Postman下载(亲测有效)
- Java数组对象的内存布局
- 【机器视觉】 dev_close_inspect_ctrl算子
- JavaIO流(1)--File类的使用
- 如何写一个数据库中间件以及需要准备的知识储备
- Asp.NetCore之组件写法
- IDEA运行多个实例
- 【定位问题】基于matlab GUI RSSI无线定位【含Matlab源码 1054期】
- python程序狮_Python编程狮
- OOP的核心思想是什么?请简述你对OOP的理解
- canfd收不到数据_CAN FD网络的通信距离问题分析
- 图——基本的图算法(四)关键路径
- 怎么才能编辑PDF里面的内容
- VS2019删除空白行
- 我是如何拿到蚂蚁金服实习 offer 的
- Qt笔记(十五)之设置程序图标