博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异或最大值
阅读量:5098 次
发布时间:2019-06-13

本文共 1303 字,大约阅读时间需要 4 分钟。

1216: 异或最大值

Time Limit: 2 Sec Memory Limit: 128 Mb

Description

给定一些数,求这些数中两个数的异或值最大的那个值

Input

多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。

Output

任意两数最大异或值

Sample Input

3

3
7
9

Sample Output

14

Hint

Source

CSGrandeur的数据结构习题

思路:

暴力\(N^2\)铁定超时

贪心一下

xor 即不同为1,相同为0

如果一个数a去找能得到 最大异或值 的b

(我也搞不清楚哪里是最高位了,就把最右边当第一位吧)

二进制较高位不同的数字一定比他们二进制较高位相同的异或值大

比如 有三个数 10 6 8

10的二进制是1010

6的二进制是0101

8的二进制是1000

则和10异或值最大的就是6(第4位比较)

贪心好了

下面就该实现了

二进制无非就0和1

要快速查找,就可以建一个01字典树

比如这样

cmd-markdown-logo

当范围大到int也最多有30层 时间复杂度\(nlogn\)

ps:与(&)和或(|)的最大值也是可以求的,.

考试居然忘了输出\n了,我TM真的是,╮(╯▽╰)╭ 哎

实现的话,sturct记录左孩子(1)右孩子(0)的位置

从大到小一层层遍历就好了,实现也没辣么难

附上又臭又长的代码

/*                       ▍ ★∴  ....▍▍....█▍ ☆ ★∵ ..../   ◥█▅▅██▅▅██▅▅▅▅▅███◤    .◥███████████████◤~~~~◥█████████████◤~~~~*/#include 
#include
#include
using namespace std;inline int read(){ int x=0,f=1;char s=getchar(); while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();} while('0'<=s&&s<='9') {x=x*10+s-'0';s=getchar();} return x*f;}int n;int a[100007];inline int max(int a,int b) {return a>b?a:b;}struct node{ int a,b;}e[100007*20];int tot=1;inline void build(int x){ int p=1; for(int i=30;i>=0;i--) { int tmp=x&(1<
=0;i--) { int tmp=x&(1<

转载于:https://www.cnblogs.com/dsrdsr/p/9319770.html

你可能感兴趣的文章
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
Django中间件
查看>>
xcode 5.1安装vvdocument
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
MySQL更改默认的数据文档存储目录
查看>>
替代微软IIS强大的HTTP网站服务器工具
查看>>
6.5 案例21:将本地数据库中数据提交到服务器端
查看>>
PyQt5--EventSender
查看>>
android 通过AlarmManager实现守护进程
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
win7下把电脑设置成wlan热
查看>>
Java 多态 虚方法
查看>>
jquery.validate插件在booststarp中的运用
查看>>
java常用的包
查看>>
PHP批量覆盖文件并执行cmd命令脚本
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
支持向量机——内核
查看>>
MFC注册热键
查看>>
万能的SQLHelper帮助类
查看>>
uboot分析:uboot的启动过程分析
查看>>