[2019杭电多校第五场][hdu6625]three arrays(01字典树)
2024-10-07 10:21:23
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625
大意为给你两个数组a和b,对应位置异或得到c数组,现在可以将a,b数组从新排序求c数组,使得字典序最小。
大致的做法就是用两个数组中的数字二进制 建两颗字典树,同时记录每个位置的个数。然后在两颗字典树上同时dfs,优先往0-0和1-1方向走,不能走再走0-1,1-0方向。
因为0-0和1-1两种情况不分先后,所以走出来的不一定是最小的,走完得到的c数组要排序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = + ;
struct Trie {
int tree[maxn * ][], num[maxn * ];
int len, root;
int newcode() {
tree[len][] = tree[len][] = ;
num[len] = ;
return len++;
}
void init() {
len = ;
root = newcode();
}
void insert(int x) {
int now = root;
for (int i = ; i >= ; i--) {
int k = (x >> i) & ;
if (!tree[now][k])
tree[now][k] = newcode();
now = tree[now][k];
num[now]++;
}
}
}A, B;
int ans[maxn];
void slove(int n) {
for (int i = ; i <= n; i++) {
ans[i] = ;
int nowA = , nowB = ;
for (int j = ; j >= ; j--) {
if (A.num[A.tree[nowA][]] && B.num[B.tree[nowB][]]) {
nowA = A.tree[nowA][], nowB = B.tree[nowB][];
A.num[nowA]--, B.num[nowB]--;
}
else if (A.num[A.tree[nowA][]] && B.num[B.tree[nowB][]]) {
nowA = A.tree[nowA][], nowB = B.tree[nowB][];
A.num[nowA]--, B.num[nowB]--;
}
else if (A.num[A.tree[nowA][]] && B.num[B.tree[nowB][]]) {
nowA = A.tree[nowA][], nowB = B.tree[nowB][];
A.num[nowA]--, B.num[nowB]--;
ans[i] += ( << j);
}
else if (A.num[A.tree[nowA][]] && B.num[B.tree[nowB][]]) {
nowA = A.tree[nowA][], nowB = B.tree[nowB][];
A.num[nowA]--, B.num[nowB]--;
ans[i] += ( << j);
}
}
}
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, x;
A.init(), B.init();
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &x), A.insert(x);
for (int i = ; i <= n; i++)
scanf("%d", &x), B.insert(x);
slove(n);
sort(ans + , ans + + n);
for (int i = ; i <= n; i++)
printf("%d%c", ans[i], i == n ? '\n' : ' ');
} }
最新文章
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
- 用批处理启动MySQL命令行工具
- mysql登录基本语句
- 【转】C++11常用特性的使用经验总结
- NeHe OpenGL教程 第三十九课:物理模拟
- SaaS系列介绍之十四: SaaS软件开发分析
- 针对上一篇文章中的代码,想出的重构方案(python实现)
- 轻量级交互数据json格式初探
- 控制台console使用MFC库函数,Cout输出CString的方法
- Einbahnstrasse
- Mysql SQL Mode详解
- __call__
- C#项目中关于多个程序集下App.config文件的问题
- day19 反射
- java程序员如何编写更好的单元测试的7个技巧
- 压力测试工具JMeter入门教程<;转>;
- SpringMVC 使用 RESTful 架构实现 CRUD 操作
- 深度学习(一) BP神经网络
- 017.1 stringBuffer
- 国内外三个领域巨头告诉你Redis怎么用
热门文章
- “HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求”之解决办法
- NOIP模拟赛(by hzwer) T1 小奇挖矿
- mysql——批量插入数据
- java——逻辑运算符与(&;和&;&;)或(|和||)
- Linux内核设计与实现 总结笔记(第十五章)进程地址空间
- POJ 3691 DNA repair ( Trie图 &;&; DP )
- 在Python中,如何将一个字符串数组转换成整型数组
- Kohana重写接收不到get参数问题
- 【CF1249D】Too Many Segments(贪心,set,vector)
- 洛谷P1982 小朋友的数字——题解