019(The XOR Largest Pair)(字典树)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472
题目思路:异或是啥呀?
异或就是把两个数字变成位数相同的二进制在同位比较,相同为0,不同为1,如:
011
100
——
111
所以 3 XOR 4 == 7
那让我们找异或不就是说把一大堆二进制的字符串存起来找嘛
那基本思路就出来了,将数字转变成由 0 和 1组成的字符串,然后找不同
字符串?找不同?那不就是把字典树糊人脸上了嘛
所以这个程序的非主体部分就白给了:
一个是主程序,输入 n,输入 n 个 x,存起来
一个是存储,用 (x>>k)&1 把每一位倒腾出来再用字典树的方式存储
注意!异或的解释里有“位数相同”这几个字
所以要在前面用 0 补齐,它说了“小于 2^31 "和“小于 10^5 ”,所以横坐标开到 32*100000+1 就足够
接下来就是程序的主体部分:搜索,我应该如何找到那两个凑起来最大的串串呢
首先我可以先敲定一个字符串,然后再上树里找去
但是那两个答案串本就无法确定,那直接一个一个定得了
所以在主程序里面每存一个 x 就要假定这个 x 为其中一个答案串去寻找
还是用 (x>>k)&1 把每一位倒腾出来然后一位一位搞
如果说它的对位,也就是那个存 !((x>>k)&1) 的地方有东西
也就是说平白无故多个1出来
行了,把 1 以正确的位置存进ans(即 k ),然后那个我们对位的串就是第二个答案串了
凑凑凑出来一个 ans,打回去,和其他的一众 ans 比比,找那个“力拔山兮气盖世”的
最后输出
注意!从最高位开始,性价比最高
#include<bits/stdc++.h>
using namespace std;
int trie[3200001][3],tot=1,ans=-10000,n,x,i;
void putin(int x){
int p=1,k,t;
for(k=30;k>=0;k--){
//注意,从最高位开始
t=(x>>k)&1;//把每一位导出来
if(trie[p][t]==0){
trie[p][t]=(++tot);
}
p=trie[p][t];
}//以字典树的方式存储
}
int finding(int x){//核心程序
int ans=0,p=1,k;
//ans初始值必须等于0
//不然出来什么“野1”不好解释
for(k=30;k>=0;k--){
//注意,从最高位开始
int t=(x>>k)&1;//一位一位导
if(trie[p][!t]){
//对位有人
ans=ans|(1<<k);
//按正确的位置存1
p=trie[p][!t];
//将其视为第二个答案串
}
else{//什么?难办?
p=trie[p][t];
//那就别办了
}
}
return ans;//打回去
}
int main(){
scanf("%d",&n);//n
for(i=0;i<n;++i){//n个数字
scanf("%d",&x);//输进去
putin(x);//存了它
ans=max(ans,finding(x));
//找那个最大的
}
printf("%d",ans);//打出来
return 0;
}
题目总结:新知识点:看到位运算可以往字符串方面想想
019(The XOR Largest Pair)(字典树)的更多相关文章
- CH 1602 - The XOR Largest Pair - [字典树变形]
题目链接:传送门 描述在给定的 $N$ 个整数 $A_1, A_2,\cdots,A_N$ 中选出两个进行xor运算,得到的结果最大是多少? 输入格式第一行一个整数 $N$,第二行 $N$ 个整数 $ ...
- The XOR Largest Pair(tire树)
题目 The XOR Largest Pair 解析 一年前听学长讲这道题,什么01trie,好高级啊,所以没学,现在一看.... 看到xor就应该想到二进制,一看数据\(A_i< 2^{31} ...
- CH1602 The XOR Largest Pair【Trie树】
1602 The XOR Largest Pair 0x10「基本数据结构」例题 描述 在给定的N个整数A1,A2……AN中选出两个进行xor运算,得到的结果最大是多少? 输入格式 第一行一个整数N, ...
- 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie
题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...
- 字典树-THE XOR largest pair
题目:给你n个数字A1,A2....An ,问从中选出两个数字异或运算得到的最大结果是多少 0<=Ai<231 用字典树,记录每个数字的31位2进制01串(int 为4个字节,每个字节8个 ...
- The XOR Largest Pair(Tire字典树应用)
题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> ...
- 题解0014:信奥一本通1472——The XOR Largest Pair(字典树)
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472 题目描述:在给定的 N 个整数中选出两个进行异或运算,求得到的结果最大是多少. 看到这 ...
- HDU--5269 ZYB loves Xor I (字典树)
题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制 我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...
- HDU 5715 XOR 游戏 二分+字典树
XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...
随机推荐
- input输入框自动填充的问题
火狐浏览器打开页面,input可以自动填充历史输入值,现在想无论input类型是type='text'还是'password'都禁止自动填充,因为我写的页面在input='text'时先检查是否有输入 ...
- Asp.Net在线预览Word文档的解决方案与思路
前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...
- Docker极简入门:使用Docker-Compose 搭建redis集群
为了构建一个集群,我们首先要让 redis 启用集群模式 一个简单的配置文件如下redis.conf # redis.conf file port 6379 cluster-enabled yes c ...
- 详谈:pNFS增强文件系统架构
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 通过 NFS(由服务器.客户机软件和两者之间的协议组成) ...
- 『现学现忘』Git基础 — 20、Git中忽略文件补充
目录 1.忽略文件常遇到的问题 2.忽略文件配置优先级 3.忽略已跟踪文件的改动(本机使用) 4.autocrlf和safecrlf参数说明 (1)提出问题 (2)autocrlf说明 (3)safe ...
- python+pytest接口自动化(15)-日志管理模块loguru简介
python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...
- Java 16 新特性:record类
以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...
- DingtalkChatbot简单使用
DingtalkChatbot 前言:该项目配合钉钉机器人 ,手机用户可以通过面对面建群创建单人群聊然后在电脑端 ···->智能群助手->添加机器人->自定义-> 然后添加机器 ...
- 揭秘华为云GaussDB(for Influx):数据直方图
摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第九期:最佳实践 ...
- ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例
一.两个核心概念:bucket和metric 1.1 bucket 有如下数据 city name 北京 张三 北京 李四 天津 王五 天津 赵六 天津 王麻子 划分出来两个bucket,一个是北 ...