HDU 6625 (01字典树)
题意:
给定两个长为n的数组a和b;
重新排列a和b,生成数组c,c[i]=a[i] xor b[i];
输出字典序最小的c数组。
分析:
将a中的数插入一颗01字典树a中;
将b中的数插入一颗01字典树b中;
在trie树上查找n次,每次同时在a和b中下移一层;
if 能同时走0,则同时走0;
else if 能同时走1,则同时走1;
else if 树a能走0&&树b能走1,则a走0、b走1;
else if 树a能走1&&树b能走0,则a走1、b走0;
else 向c中插入一个新数为这两个节点的异或值;
最后对c排序。
复杂度O(T*n*30)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
typedef long long LL;
struct Trie01{ int ch[ * maxn][];
int cnt[*maxn];
int node_cnt;
inline void init(){
node_cnt = ;
memset(ch[],,sizeof(ch[])); }
inline void Insert(LL x){
int cur = ;
for(int i = ;i >= ;--i){
int idx = (x >> i) & ;
if(!ch[cur][idx]){
memset(ch[node_cnt],,sizeof(ch[node_cnt]));
ch[cur][idx] = node_cnt;
cnt[node_cnt++]=;
}
cur = ch[cur][idx];
cnt[cur]++;
}
}
}t1,t2;
vector<int> ans;
void solve(int N){
int u1,u2;
while(N--) {
u1 = u2 = ;
int x = ;
for(int p = ; p >= ; p--) { if(t1.cnt[t1.ch[u1][]] && t2.cnt[t2.ch[u2][]]) {
t1.cnt[t1.ch[u1][]]--;
t2.cnt[t2.ch[u2][]]--;
u1 = t1.ch[u1][]; u2 = t2.ch[u2][];
} else if(t1.cnt[t1.ch[u1][]] && t2.cnt[t2.ch[u2][]]) {
t1.cnt[t1.ch[u1][]]--;
t2.cnt[t2.ch[u2][]]--;
u1 = t1.ch[u1][]; u2 = t2.ch[u2][];
} else if(t1.cnt[t1.ch[u1][]] && t2.cnt[t2.ch[u2][]]) {
t1.cnt[t1.ch[u1][]]--;
t2.cnt[t2.ch[u2][]]--;
u1 = t1.ch[u1][]; u2 = t2.ch[u2][];
x ^= ( << p);
} else {
t1.cnt[t1.ch[u1][]]--;
t2.cnt[t2.ch[u2][]]--;
u1 = t1.ch[u1][]; u2 = t2.ch[u2][];
x ^= ( << p);
} }
ans.push_back(x);
}
return ;
}
int main(){
int _;scanf("%d",&_);
while(_--){
int n;scanf("%d",&n);
t1.init(),t2.init();
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
t1.Insert(x);
}
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
t2.Insert(x);
}
ans.clear();
solve(n);
sort(ans.begin(),ans.end());
printf("%d",ans[]);
for(int i=;i<ans.size();i++)
{
printf(" %d",ans[i]);
}puts("");
}
}
HDU 6625 (01字典树)的更多相关文章
- three arrays HDU - 6625 (字典树)
three arrays \[ Time Limit: 2500 ms \quad Memory Limit: 262144 kB \] 题意 给出 \(a\),\(b\) 数组,定义数组 \(c[i ...
- HDU - 4825 01字典树套路题
/*H E A D*/ struct Trie{ int son[maxn<<2][2]; int b[67],tot; void init(){ // memset(son,0,size ...
- 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 && acdream 1063 01字典树异或问题
题意: 给一个集合,多次询问,每次给一个k,问你集合和k异或结果最大的哪个 题解: 经典的01字典树问题,学习一哈. 把一个数字看成32位的01串,然后查找异或的时候不断的沿着^为1的路向下走即可 # ...
- HDU 5536 Chip Factory (暴力+01字典树)
<题目链接> 题目大意: 给定一个数字序列,让你从中找出三个不同的数,从而求出:$\max_{i,j,k} (s_i+s_j) \oplus s_k$的值. 解题分析:先建好01字典树,然 ...
- HDU 4825 Xor Sum (模板题)【01字典树】
<题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...
- HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序
题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...
- Chip Factory---hdu5536(异或值最大,01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...
随机推荐
- QQ音乐爬虫
#今日目标 **QQ音乐爬虫** 今天要爬取的是QQ音乐任意歌手的所有音乐歌词,因为笔者是周杰伦的忠实粉丝,所以专门写了个爬虫来爬取他的音乐的歌词,因为他的音乐在咪咕音乐可以听,所以便没有去爬取. 好 ...
- JAVA并发编程实战笔记 第二章
2.1 线程安全性 当多个线程访问某个类时,不论这些线程如何交替执行,这个类始终都能表现出正确的行为,且主调代码中不需要任何额外的同步或协同,则称这个类是线程安全的. 类不变性条件(Invariant ...
- springcloud-概念
springcloud-概念 一.架构演进过程 单体架构----分布式架构----SOA(eg.dubbo)服务治理架构----微服务 随着互联网的发展,需求的激增致使网站应用规模的扩大,最后转成了技 ...
- oracle链接报错shared memory realm does not exist
问题描述: 前两天能够正常链接,今天来了突然不能链接,原因不详. 处理方法: 连接linux进行如下操作: 1.sqlplus /nolog 2.conn / as sysdba 3.startup ...
- redis之使用场景
随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存储数据,可以极大的提高查询性能,对产品在架构上很好的补充.在某些场景下,可以充分的利用 Redis 的特性 ...
- vue学习【三】vue-router路由显示多页面
大家好,我是一叶,今天是七夕,单身狗的我还在这里写踩坑文.在这里还是要祝大家早日脱单(能不能脱单自己心里没个数吗).本篇继续踩坑,在单页面上展示多页的内容,大家的想法是什么,估计大家第一印象会是ifr ...
- cobbler装机系统部署
1.cobbler安装 [root@linux-node1 ~]# cp /etc/cobbler/settings{,.ori} # 备份 # server,Cobbler服务器的IP. sed - ...
- 右则css 小浮条
<!--右边浮动--> <div class="indexfu"> <div class="indexfu2" id=" ...
- 2017 ICPC 南宁 L 带权最大递增子序列
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...
- Python之常用模块三(面向对象相关的三个模块)
hashlib.configparser.logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...