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 ...
随机推荐
- C# 一个特别不错的http请求类
using System; using System.Collections; using System.Collections.Generic; using System.Collections.S ...
- 很好的sql多表
oracle 多表联合查询总结归纳 2018年08月16日 20:57:39 阅读数:44905 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: ...
- Date类、SimpleDateFormat类
Date 构造方法: 1.无参数构造方法: Date date = new Date(); System.out.println(date);// Thu Mar 28 16:28:40 CST 20 ...
- DataReader分页性能测试
参考程序地址:http://www.cnblogs.com/eaglet/archive/2008/10/09/1306806.html 最近遇见程序慢的问题,使用的DataReader,猜想是分页导 ...
- Java EE之Request部分方法使用示例
Description: ApplicationProjectName:MedicineMs login.jsp[action:login|method:get] to loginServlet Ou ...
- CF920E Connected Components?
CF luogu 先讲两个靠谱的做法 1.首先因为有n个点,m条不存在的边,所以至少存在一个点,和m/n个点之间没边,所以把这个点找出来,连一下其他相连的点,这样还剩m/n个点没确定在哪个联通块,而这 ...
- java时间计算
- git操作手册
git教案链接:https://git-scm.com/book/zh/v2 1.1 起步 - 关于版本控制 于是分布式版本控制系统(Distributed Version Control Syste ...
- 分页插件通用处理,以asp.net mvc为例
Model: public class PaggerModel { public PaggerModel() { BarSize = ; } public PaggerModel(int total, ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...