☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
传送门:>Here<
题意:给出一个集合,包含N个数,每次询问给出一个数x,问x与集合中的一个数y异或得到最大值时,y是多少?
解题思路
由于N,M非常大,暴力显然不行。抓住重点是异或,所以可以把数字转换为二进制。这又让我们想到了字典树……
根据二进制中数的定理:任何一个位置靠前的数比后面所有的数加起来都大。就好像十进制,100比99大。因此异或的时候要尽量让靠前的数与它不一样。
把集合内的所有数字根据二进制建立字典树。很明显因为是二进制只有0和1,当前的trie一定是一棵二叉树。因此我们可以拿当前数到trie里面跑一遍,因为trie是前缀树,所以先碰到的肯定是二进制前的。如果有不同的路(就是说如果当前数字为0,看有没有通往1的路)就走,否则没办法
注意到数字最多只有32位。因为要建立前缀树,所以如果数字太小可以补充前导零。每一次用一个bool数组记录一下数字的各个位即可
Code
End数组要清零
/*By DennyQi*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
const int MAXN = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar(); return x * w;
}
int T,N,M,x;
int ch[MAXN][],cnt,End[MAXN];
bool num[];
inline void Convert(int x){
memset(num, , sizeof(num));
for(int i = ; x > ; --i, x>>=) num[i] = x%;
}
inline void Insert(int x){
Convert(x);
int u = ;
for(int i = ; i <= ; ++i){
if(!ch[u][num[i]]) ch[u][num[i]] = ++cnt;
u = ch[u][num[i]];
}
End[u] = x;
}
inline int Query(int x){
Convert(x);
int u = , res = ;
for(int i = ; i <= ; ++i){
if(!ch[u][!num[i]]) u = ch[u][num[i]];
else u = ch[u][!num[i]];
if(End[u]) res = Max(res, End[u]);
}
return res;
}
inline void Init(){
cnt = ;
memset(ch, , sizeof(ch));
memset(End, , sizeof(End));
}
int main(){
T=r;
for(int _c = ; _c <= T; ++_c){
printf("Case #%d:\n",_c);
Init();
N=r,M=r;
for(int i = ; i <= N; ++i) x=r, Insert(x);
for(int i = ; i <= M; ++i) x=r, printf("%d\n", Query(x));
}
return ;
}
☆ [HDU4825] Xor Sum「最大异或和(Trie树)」的更多相关文章
- HDU4825 Xor Sum —— Trie树
题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU--4825 Xor Sum (字典树)
题目链接:HDU--4825 Xor Sum mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草 把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同 ...
- HDU4825 Xor Sum(字典树解决最大异或问题)
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...
- HDU-4825 Xor Sum,字典树好题!
Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...
- HDU4825 Xor Sum(贪心+Trie树)
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...
- poj3764 The XOR Longest Path【dfs】【Trie树】
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10038 Accepted: ...
- 【BZOJ3261】最大异或和 Trie树+贪心
[BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...
- 【动画】看动画轻松理解「Trie树」
Trie树 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 以示区别 ...
- AtCoder Regular Contest 098 D - Xor Sum 2 区间异或=相加 DP思想
题意:给出n个数,求它的连续子序列中,满足下列公式,(l,r)的对数有多少对 Al xor Al+1 xor … xor Ar=Al + Al+1 + … + Ar 思路:由题意可以得到,连续子序列, ...
随机推荐
- 解决React通过ajax加载数据更新页面不加判断会报错的问题
通过AJAX加载数据是一个很普遍的场景.在React组件中如何通过AJAX请求来加载数据呢?首先,AJAX请求的源URL应该通过props传入:其次,最好在componentDidMount函数中加载 ...
- [loadrunner]通过检查点判定事务是否成功
//检查点设置语句 //tmp在此时为临时参数 web_reg_find("SaveCount=tmp", "Text=xxx", LAST); ...
- 二十:让行内元素在div中垂直居中
(1)使用display:table-cell配合vertical-align:center(淘宝也是这样用的) <div class="method4"> <s ...
- Achievements
看了Suma,觉得懂了85%以上. 两个月可以学这么多.方法是不懂的就学就行了. 最近学了:字符串,网络流,线段树,斯特林反演,多项式与生成函数,一些数论等.
- NFV论文集(二)
一 文章名称:VNF Placement with Replication for Load Balancing in NFV Networks 发表时间:2017 期刊来源:ICC: IEEE In ...
- OSS网页上传和断点续传(STSToken篇)
云账号AccessKey拥有所有API访问权限,在客户端不要直接使用,会泄露ak信息,造成安全问题.所以使用STS方式(临时账号权限)给客户端授权. C#版获取STSToken 一.下载阿里SDK(a ...
- 书城项目第五阶段---book表的curd
JavaEE三层架构分析 MVC
- http/https与websocket的ws/wss的关系以及通过Nginx的配置
http/https与websocket的ws/wss的关系 - 哒哒哒 - CSDN博客 https://blog.csdn.net/Garrettzxd/article/details/81674 ...
- vue 使用sass 和less
npm i sass-loader --save -dev(-D)
- AngularJS集合数据遍历显示
AngularJS集合数据遍历显示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...