hdu 4825 && acdream 1063 01字典树异或问题
题意:
给一个集合,多次询问,每次给一个k,问你集合和k异或结果最大的哪个
题解:
经典的01字典树问题,学习一哈.
把一个数字看成32位的01串,然后查找异或的时候不断的沿着^为1的路向下走即可
#include <bits/stdc++.h>
#define endl '\n'
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e5+10,maxm=2e6+10;
int casn,n,m,k,num[maxn];
struct Trie{
int next[maxn*32][2],size;
ll val[maxn*32];
void init(){
size=0;
memset(next,0,sizeof next);
memset(val,0,sizeof val);
}
void insert(ll x){
int cur=0;
for(int i=32;i>=0;i--){
int k=(x>>i)&1;
if(!next[cur][k]) next[cur][k]=++size;
cur=next[cur][k];
}
val[cur]=x;
}
ll find(ll x){
int cur=0;
for(int i=32;i>=0;i--){
int k=(x>>i)&1;
if(next[cur][k^1])cur=next[cur][k^1];
else cur=next[cur][k];
}
return val[cur];
}
}trie;
string s[maxn]; int main() {
IO;
cin>>casn;
int __=0;
while(casn--){
cin>>n>>m;
trie.init();
cout<<"Case #"<<++__<<":"<<endl;
while(n--){
ll x;
cin>>x;
trie.insert(x);
}
while(m--){
ll x;
cin>>x;
cout<<trie.find(x)<<endl;
}
}
return 0;
}
acdream 1063 代码
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e5+10,maxm=2e6+10;
int casn,n,m,k,num[maxn];
struct Trie{
int next[maxn*32][2],size;
ll val[maxn*32];
void init(){
size=0;
memset(next,0,sizeof next);
memset(val,0,sizeof val);
}
void insert(ll x){
int cur=0;
for(int i=32;i>=0;i--){
int k=(x>>i)&1;
if(!next[cur][k]) next[cur][k]=++size;
cur=next[cur][k];
}
val[cur]=x;
}
ll find(ll x,bool flag){
int cur=0;
for(int i=32;i>=0;i--){
int k=(x>>i)&1;
if(flag){
if(next[cur][k^1]) cur=next[cur][k^1];
else cur=next[cur][k];
}else {
if(next[cur][k])cur=next[cur][k];
else cur=next[cur][k^1];
}
}
return val[cur];
}
}trie; int main() {
IO;
cin>>casn;
while(casn--){
cin>>n;
trie.init();
while(n--){
ll x;
string s;
cin>>s>>x;
if(s=="insert") trie.insert(x);
else if(s=="qmin") cout<<(x^trie.find(x,0))<<endl;
else cout<<(x^trie.find(x,1))<<endl;
}
}
return 0;
}
hdu 4825 && acdream 1063 01字典树异或问题的更多相关文章
- HDU 4825 Xor Sum(字典树)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 这道题更明确的说是一道01字典树,如果ch[u][id^1]有值,那么就向下继续查找/ ...
- [BZOJ4260] Codechef REBXOR (01字典树,异或前缀和)
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- HDU 4825 Xor Sum(01字典树入门题)
http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...
- hdu 4825 Xor Sum(01字典树模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题解:一到01字典树的模版题,01字典树就是就是将一些树用二进制放到一个树上这样可以方便对整体异 ...
- HDU 4825 Xor Sum (模板题)【01字典树】
<题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...
- Chip Factory---hdu5536(异或值最大,01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...
- BZOJ 4260 Codechef REBXOR (区间异或和最值) (01字典树+DP)
<题目链接> 题目大意:给定一个序列,现在求出两段不相交的区间异或和的最大值. 解题分析: 区间异或问题首先想到01字典树.利用前缀.后缀建树,并且利用异或的性质,相同的两个数异或变成0, ...
- HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序
题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...
随机推荐
- ruby----%使用法
%{String} 用于创建一个使用双引号括起来的字符串,这个表示法与%Q{String}完全一样 result = %{hello} puts "result is: #{result} ...
- Linux环境变量总结
现在每天测试到时候会与Linux打交道,自然也会用到环境变量了.看了网上几篇文章,结合自己到实践和看法,总结以下Linux的环境变量吧.一.什么是环境变量?环境变量相当于给系统或用户应用程序设置的一些 ...
- 阅读:重新介绍 JavaScript(JS教程)
这篇文章是记录自己阅读重新介绍 JavaScript(JS 教程)的记录和个人体会 在线调试代码工具:https://codepen.io/pen 引言 分歧根源:名字Javascript和Java有 ...
- LeetCode(193. Valid Phone Numbers)(sed用法)
193. Valid Phone Numbers Given a text file file.txt that contains list of phone numbers (one per lin ...
- 解析ArcGis的标注(三)——标注的放置 与 转注记修改
该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 写着写着发现ArcGis标注的破事儿好多啊 ...
- CRM项目之RBAC权限组件-day26
写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...
- Dijkstra和Floyd算法
#include #include #include #define Infinity 999 //最大值 #define Max_Vertex_Num 20 //顶点数最多为20 #define L ...
- C++ WString与String互相转换
std::wstring StringToWString(const std::string& str) { , str.c_str(), -, NULL, ); wchar_t *wide ...
- Newtonsoft.Json序列化Enum类型
[JsonConverter(typeof(StringEnumConverter))] public StringAlignment TextAlign { get => textAlign; ...
- Java8新特性 并行流与串行流 Fork Join
并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流. Java 8 中将并行进行了优化,我们可以很容易的对数据进行并 行操作. Stream API 可以声明性地通过 para ...