Description

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

Input

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

Output

任意两数最大异或值

Sample Input

3

3

7

9

Sample Output

14

Hint

Source

CSGrandeur的数据结构习题

异或

异或运算符(^ 也叫xor(以后做题会遇到xor,就是异或))

规则:0^0 = 0,01=1,10=1,1^1=0 参加位运算的两位只要相同为0,不同为1

例子:3^5 = 6(00000011^00000101=00000110)

暴力(不用说)

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxN = 1e5 + 7; int a[maxN]; int main() {
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++ i) {
scanf("%d",a[i]);
}
int maxn = 0;
for(int i = 1;i < n;++ i) {
for(int j = i + 1;j <= n;++ j) {
maxn = max(maxn,a[i] xor a[j]);
}
}
printf("%d",maxn);
}

正解:我们可以发现异或的一些性质,不同为1,根据等比数列求和,

等比数列求和

$2^1 + 2^2 + 2^3 + 2^4 < 2^5 $

证明: 设\(2^1 + 2^2 + 2^3 + 2^4\)为S,那么\(2S = 2^2 + 2^3 + 2^4 + 2^5 - S\);

等于$2^5 - 1 < 2^5 $

为什么要涉及到这个呢,因为我们要贪心的选取,一定要看看有没有特殊情况.

我们从高位开始选择与其不同的二进制位.就Ok了.

code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int maxN = 1e5 + 7; int a[maxN];
int son[maxN * 20][3],cnt; void init() {
memset(son,0,sizeof(son));
cnt = 0;
return;
}
void build(ll a) {
int now = 0;
for(int i = 32;i >= 0;-- i) {
int qwq = (a >> i & 1);
if( !son[now][qwq] )son[now][qwq] = ++ cnt;
now = son[now][qwq];
}
} ll find(ll a) {
ll res = 0,now = 0;
for(int i = 32;i >= 0;-- i) {
bool tmp = ((a >> i & 1) ^ 1);
if(son[now][tmp]) now = son[now][tmp],res = res | (1LL << i);
else now = son[now][tmp ^ 1];
}
return res;
} int main() {
int n;
while(~scanf("%d", &n)) {
init();
for(int i = 1;i <= n;++ i)
scanf("%d",&a[i]);
for(int i = 1;i <= n;++ i)
build(a[i]);
ll Ans = 0;
for(int i = 1;i <= n;++ i) {
Ans = max(Ans,find(a[i]));
}
printf("%lld\n",Ans);//一定要注意:换行!!!!
}
}

CSU 1216异或最大值 (0-1 trie树)的更多相关文章

  1. CSU 1216 异或最大值

    求n个数里面,求两两异或的最大值 直接来肯定会超时 既然要异或最大值,那么两个数的二进制肯定是正好错开为好...为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面 ...

  2. ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1216 题目大意是给了n个数,然后取出两个数,使得xor值最大. 首先暴力枚举是C(n,  ...

  3. 中南oj 1216: 异或最大值 数据结构

    1216: 异或最大值 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 98  Solved: 29 [Submit][Status][Web Boar ...

  4. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  5. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  6. 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)

    1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...

  7. 【bzoj3689】异或之 可持久化Trie树+堆

    题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...

  8. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  9. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.       有M个操作,有以下两种操作类型:1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2.Q l r x:询问操 ...

随机推荐

  1. go语言初始化内部结构体3中方式

    package main import ( "fmt" ) type User struct { Id int Name string Age int } type Manger ...

  2. pat1090. Highest Price in Supply Chain (25)

    1090. Highest Price in Supply Chain (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 C ...

  3. web相关知识

    1,网络编程/网站编程:敲一个网站,别人可以访问 访问:在地址栏里面敲入地址,就可以访问了. 服务器如果放在公网,那么别人就可以通过IP地址进行访问 所以我们可以先在本地把我们的网站搭好,别人就可以来 ...

  4. 搭建maven web项目并配置quartz定时任务【业务:对比数据变化内容】 历程

    搭建maven web项目并配置quartz定时任务[业务:对比数据变化内容] 历程2018年03月03日 10:51:10 守望dfdfdf 阅读数:100更多个人分类: 工作 问题编辑版权声明:本 ...

  5. The fourteenth day

    A man is not old as long as he is seeking something. A man is not old until regrets take the place o ...

  6. mongoose添加属性问题

    在项目中遇到这样一个问题. 项目地址: https://github.com/ccyinghua/vue-node-mongodb-project/blob/master/07-shoppingCar ...

  7. Visual Studio 编辑器打开项目后,一直提醒Vs在忙,解决方法

    今天打开VS2015后,因为这个解决中有很项目,突然就一直现在加载中,点击VS提示在忙,怎么破那?请往下看 第一种方法 1.关闭VS: 2.去C:\Users\<your users name& ...

  8. MyEclipse 相关配置操作、问题处理及快捷键说明

    MyEclipse傻瓜式安装不做介绍,试用期结束后破解操作见博客:MyEclipse 2014 破解补丁及激活步骤 以下为安装完MyEclipse后一般需要进行的一些配置,写来自己参考用.比较简陋,望 ...

  9. 笨办法学Python(三十二)

    习题 32: 循环和列表 现在你应该有能力写更有趣的程序出来了.如果你能一直跟得上,你应该已经看出将“if 语句”和“布尔表达式”结合起来可以让程序作出一些智能化的事情. 然而,我们的程序还需要能很快 ...

  10. 笨办法学Python(二十)

    习题 20: 函数和文件 回忆一下函数的要点,然后一边做这节练习,一边注意一下函数和文件是如何在一起协作发挥作用的. from sys import argv script, input_file = ...