0x16 Tire之最大的异或对
我们考虑所有的二元组(i,j)且i<j,那么本题的目标就是在其中找到Ai xorAj的最大值。也就是说,对于每个i(1≤i≤N),我们希望找到一个j(1<j<i),使AixorAj最大,并求出这个最大值。
我们可以把每个整数看作长度为32的二进制01串(数值较小时在前边补0),并且把A1~Ai-1对应的32位二进制串插入一棵Trie 树(其中最低二进制位为叶子节点)。接下来,对于Ai对应的32位二进制串,我们在Trie中进行一次与检索类似的过程,每一步都尝试沿着“与Ai的当前位相反的字符指针”向下访问。若与Ai的当前位相反的字符指针”指向空节点,则只好访问与Ai当前位相同的字符指针。根据xor运算“相同得0,不同得1”的性质,该方法即可找出与Ai做xor运算结果最大的Aj。
如下图所示,在一棵插入了2(010), 5(101), 7111)三个数的Trie中,分别查询与6(110), 3(011)做xor运算结果最大的数。(为了简便, 图中使用了3位二进制数代替32位二进制数)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int SIZE=100010;
int trie[SIZE*32+5][2], tot = 1; // 初始化,假设字符串由小写字母构成
int a[SIZE], n, ans; void insert(int val) { // 插入一个二进制数
int p = 1;
for (int k = 30; k >= 0; k--) {
int ch = val >> k & 1;
if (trie[p][ch] == 0) trie[p][ch] = ++tot;
p = trie[p][ch];
}
} int search(int val) {
int p = 1;
int ans = 0;
for (int k = 30; k >= 0; k--) {
int ch = val >> k & 1;
if (trie[p][ch ^ 1]) { // 走相反的位
p = trie[p][ch ^ 1];
ans |= 1 << k;
} else { // 只能走相同的位
p = trie[p][ch];
}
}
return ans;
} int main() {
cin>>n;
for(int i=1;i<=n;i++) {
scanf("%d", &a[i]);
insert(a[i]);
ans=max(ans, search(a[i]));
}
cout<<ans<<endl;
}
0x16 Tire之最大的异或对的更多相关文章
- 0x16 Tire
参考链接:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 题目链接:https://www.acwing.com/problem/con ...
- 1269 - Consecutive Sum
1269 - Consecutive Sum PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB ...
- 「十二省联考 2019」异或粽子——tire树+堆
题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅 ...
- Tire树入门专题
POJ 3630Phone List 题目连接:http://poj.org/problem?id=3630 题意:问是否有号码是其他号码的前缀. #include<iostream> # ...
- bzoj 3166 可持久化Tire
每一个数能做出的贡献就是其两端第二个比他大的中间的数和他的异或值 按权值大小排序,按照位置扔进set,set内的元素都是比他大的,也是全的 然后Tire上跑就行了.. #include<cstd ...
- HDU 4825 tire树
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- 谢特——后缀数组+tire 树
题目 [题目描述] 由于你成功地在 $ \text{1 s} $ 内算出了上一题的答案,英雄们很高兴并邀请你加入了他们的游戏.然而进入游戏之后你才发现,英雄们打的游戏和你想象的并不一样…… 英雄们打的 ...
- Tire树总结(模板+例题)
题目来自<算法竞赛设计指南> Tire树是一种可以快速查找字符串的数据结构 模板 #include<cstdio> #include<algorithm> #inc ...
- Acwing143. 最大异或对
在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...
随机推荐
- windows redis 自动启动
start.bat D: D:\dev\redis- redis-server.exe redis.conf redis.vbs createobject( 之后,把 start.bat 放在redi ...
- VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...
- Nginx反向代理部署NodeJS项目
在nginx配置文件种的http节点下: server { listen 8005; server_name localhost; location /{ proxy_set_header X_Rea ...
- 魔方---java
package LMS; import java.awt.AWTException;import java.awt.Robot;import java.awt.event.InputEvent;imp ...
- python练习题-day18
1.匹配一行文字中的所有开头的字母内容 import re s="i love you not because of who you are, but because of who i am ...
- java-concurrent包
通常所说的concurrent包基本有3个package组成 java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue,Callable,Concurren ...
- ajax阻挡设置
在请求时候设置一个变量为false的.请求方法时候用他的值判断是否在请求中,如果是true就是有请求了,就直接return ,不执行后面的方法, 如果是没有请求,就让值为true,然后开始执行ajax ...
- 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)
(借鉴请改动) 第十二章收尾 12.2.nfs网络文件系统 RHEL7默认安装了nfs,配置文件在 /etc/export 写入格式:共享目录 允许的客户端(参数) ro ...
- 关于java实现自定义曲线拟合的研究
项目需要拟合曲线,使用java实现.采用了apache-commons-math3实现自定义的曲线. 作为apache开源的搞数学计算的超强的库,一直不受市场重视.为啥呢?经过研究,使用java这个强 ...
- 我与C++的初识
Q1:学习<C++语言程序设计>课程之前,你知道什么是编程吗?谈谈上这门课之前你对编程的理解,以及你对自己编程能力的评估. A1:在学习<C++语言程序设计>课程之前,我其实对 ...