【题目】

传送门

题目描述:

在给定的 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相关推荐

  1. 【LOJ 10050】The XOR Largest Pair【Trie】

    题目大意: 题目链接:https://loj.ac/problem/10050 求一个数列中的任意两个数字亦或的最大值. 思路: 如果给出一个数字,求一个不比它位数大的数使得这两个数亦或的值最大,那么 ...

  2. 【LOJ10050】The XOR Largest Pair(字典树)

    problem 给定n个整数,在其中任意选出两个进行xor运算,得到的结果最大值是多少? n<1e5,ai在int范围内 solution 朴素枚举,O(n^2), TLE 考虑异或运算,相同为 ...

  3. 数据结构总结1(火车进栈/兔子与兔子/括号画家/Editor/邻值查找/最大子序和/前缀统计/Phone List/The XOR Largest Pair)

    问题 A: 火车进栈 题目描述 这里有n列火车将要进站再出站-- 但是,每列火车只有1节-那就是车头-- 描述 有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个 ...

  4. 【LOJ#6682】梦中的数论(min_25筛)

    [LOJ#6682]梦中的数论 https://www.cnblogs.com/cjyyb/p/11178395.html 利用min_25筛,求解约数个数函数平方的前缀和.

  5. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)

    [LOJ#572]Misaka Network 与求和 https://www.cnblogs.com/cjyyb/p/10170630.html 看到次大质因子就可以想到是min_25筛了,然后只需 ...

  6. 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)

    [LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...

  7. 【LOJ#573】【LNR#2】单枪匹马(线段树)

    [LOJ#573][LNR#2]单枪匹马(线段树) 题面 LOJ 题解 考虑拿线段树维护这个值,现在的问题就是左右怎么合并,那么就假设最右侧进来的那个分数是\(\frac{x}{y}\)的形式,那么就 ...

  8. The XOR Largest Pair(算法竞赛进阶指南 P72,Trie)

    一.题目链接: The XOR Largest Pair 二.题目大意: 有 n 个数,求任意两个数异或得到的最大值. 三.分析: 刚学习了字典树,觉得还不错. 把每个数分解为二进制存到字典树中,查询 ...

  9. 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)

    [LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...

最新文章

  1. form表单序列化去除空值
  2. LINUX下查看主机信息
  3. centos7 安装配置mesos+marathon+zookeeper
  4. 理解Promise (3)
  5. 测试软件Postman下载(亲测有效)
  6. Java数组对象的内存布局
  7. 【机器视觉】 dev_close_inspect_ctrl算子
  8. JavaIO流(1)--File类的使用
  9. 如何写一个数据库中间件以及需要准备的知识储备
  10. Asp.NetCore之组件写法
  11. IDEA运行多个实例
  12. 【定位问题】基于matlab GUI RSSI无线定位【含Matlab源码 1054期】
  13. python程序狮_Python编程狮
  14. OOP的核心思想是什么?请简述你对OOP的理解
  15. canfd收不到数据_CAN FD网络的通信距离问题分析
  16. 图——基本的图算法(四)关键路径
  17. 怎么才能编辑PDF里面的内容
  18. VS2019删除空白行
  19. 我是如何拿到蚂蚁金服实习 offer 的
  20. Qt笔记(十五)之设置程序图标

热门文章

  1. 个人秋招面经——百度
  2. 基于MCU的二维码生成及在墨水屏上进行二维码显示
  3. kali怎么安装python_kali如何安装python
  4. IDEA中SVN的使用大全
  5. 风变编程的python课程多少钱-风变编程Python小课最近很火,大家学完感受如何?...
  6. win10出现驱动强制签名_错误代码:0xc0000428以及引导文件如何修复
  7. ANSYS SCADE Suite - 学习之路
  8. 切记:别手欠升级手机系统!
  9. HTML-CSS基础笔记
  10. java bzip2 压缩_压缩工具之gzip-bzip2-xz