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. ubuntu15.04 xampp 安装memcache

    要ThinkPHP3.2里由于要用到 memcache 缓存, 如果没有配置memcache,会报错,说系统支持 memcache. 所在配置的时候有点问题,现在解决了,现把它记录下来,以便以后查阅之 ...

  2. PHP用mysql数据库存储session

    大部分使用php的人一旦应用到session都会使用cookie. cookie虽好可是它也会给我们带来一些隐患的. 隐患一:如果客户端机器的cookie一旦因病毒而失效了,那么session也就相当 ...

  3. Linux 命令-1

    1.除了/之外,所有的字符都合法,有些字符最好不要用 2.以.开头的文件将被隐藏.和window的区别 3.大小写敏感 4.命令格式: 命令 -选项 参数   例如: ls -la /etc  ,选项 ...

  4. php删除服务器所有session踢掉所有在线用户linux

    注意:如果要删除服务器上所有session,重启php服务是解决不了问题的,php的session是持久化的. 有效解决办法: 删除 /tmp 下的所有文件(默认php的session文件是在/tmp ...

  5. powerdesigner低版本打开高版本方式为只读导致无法保存PD只读read-only-mode

    由于版本号不一致 打开PD文件后提示: 点击[确定]后打开,点击[取消]后打不开 但打开后修改完毕保存提示: 解决办法: pdm文件实际上是个xml文件,直接用文本编辑器打开该文件修改版本号即可 把根 ...

  6. 远程登陆服务器(window系统)

    1,打开命令输入框: 快捷键:win+R 2.输入命令:mstsc 3.输入你的IP地址和用户名(一般为administrator) 4.输入密码

  7. Debug Diagnostics Tool创建.Net异常转储并用Windbg分析异常

    当我们要在IIS PRD环境下分析异常,并且对问题毫无头绪,又没有权限直接上打Log的代码.这个时候就是Debug Diagnostics Tool & Windbg大显神威的时候了. Deb ...

  8. SpringBoot JPA注解详解

    1.@OneToOne 2.@OneToManytargetEntity: 默认关联的实体类型.如果集合类中指定了具体类型了,不需要使用targetEntity.否则需要targetEntity指定C ...

  9. springboot Aop配置,并使用自定义注解annotation,并且拦截service层

    前言 用Spring Boot的AOP来简化处理自定义注解,并将通过实现一个简单的方法执行判断节点是否开始的状态示列源码. AOP概念 面向侧面的程序设计(aspect-oriented progra ...

  10. Linux 学习 之 bash

    Anything is programmable with defined syntax and common lib. Bash Shell is created to programme to L ...