☆ [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 思路:由题意可以得到,连续子序列, ...
随机推荐
- (深度好文)重构CMDB,避免运维之耻
(深度好文)重构CMDB,避免运维之耻 CMDB,几乎是每个运维人都绕不过去的字眼,但又是很多运维人的痛,因为CMDB很少有成功的,因此我也把它称之为运维人的耻辱. 那么到底错在哪儿了?该如何去重构它 ...
- Python-生成器_36
#生成器函数 def generator(): print(1) return 'a' ret = generator() print(ret) #只要含有yield关键字的函数都是生成器函数 # y ...
- H5 文字属性
03-文字属性 我是文字 我是文字 abc我是段落 <!DOCTYPE html> <html lang="en"> <head> <me ...
- Linux之hosts文件
一.序言: 今天同事部署环境遇到问题, 原因1:修改了主机名,在/etc/hosts文件中加了3台集群的ip和主机名,但是将默认的前两行也改了,没注意看改了哪里, 现象: 1.zookeeper单台可 ...
- Python之操作Excel
使用之前先导入三个模块: import xlwt #只能写Excel import xlrd #只能读Excel import xlutils #修改Excel,在原来的基础上修改 一.写EXCEL ...
- 【学习总结】C-翁恺老师-入门-第4周<循环控制>
[学习总结]C-翁恺老师-入门-总 1-阶乘:引入for循环 2-控制循环次数:初始化与控制条件的设置 任何一个for循环都可以写成一个while循环 for中的每一个表达式都是可以省略的:for(; ...
- HDU 2003 求绝对值
http://acm.hdu.edu.cn/showproblem.php?pid=2003 Problem Description 求实数的绝对值. Input 输入数据有多组,每组占一行,每行 ...
- vue传参
<template> <ul> <li v-for="item in list" :key="item.id"> <b ...
- 判断String类型字符串是否为空的方法
在项目中经常遇到要判断String类型的字段是否为空操作 我们可以用Apache提供的StringUtils这个工具类,不用自己去判断,也不用自己封装判断空的方法 它有两个版本,一个是org.apac ...
- Codeforces 1154F Shovels Shop
题目链接:http://codeforces.com/problemset/problem/1154/F 题目大意: 商店有n把铲子,欲购k把,现有m种优惠,每种优惠可使用多次,每种优惠(x, y)表 ...