题目链接: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' : ' ');
} }

[2019杭电多校第五场][hdu6625]three arrays(01字典树)的更多相关文章

  1. [2019杭电多校第五场][hdu6630]permutation 2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6630 题意为求出1-n,n个数的全排列中有多少种方案满足第一位为x,第n位为y,且相邻数字绝对值之差不 ...

  2. [2019杭电多校第五场][hdu6624]fraction

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624 题意为求最小的b满足$a*b^{-1}\equiv x(modp)$. 把式子化简一下: $a\ ...

  3. [2019杭电多校第五场][hdu6629]string matching(扩展kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629 题意求字符串的每个后缀与原串的最长公共前缀之和. 比赛时搞东搞西的,还搞了个后缀数组...队友一 ...

  4. [2019杭电多校第五场][hdu6628]permutation 1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6628 题意为求字典序第k小的差异数组,差异数组p满足p[i]=a[i+1]-a[i]. 头铁的爆搜,因 ...

  5. 2019杭电多校第五场 discrete logarithm problem

    https://vjudge.net/contest/317493#problem/I

  6. [2019杭电多校第三场][hdu6609]Find the answer(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6609 大致题意是求出每个位置i最小需要将几个位置j变为0(j<i),使得$\sum_{j=1}^ ...

  7. [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...

  8. 2019杭电多校第三场hdu6609 Find the answer(线段树)

    Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...

  9. 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)

    //never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...

随机推荐

  1. python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  2. java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二

    TreeSet有序子类; HashSet无序子类 重复重复元素,Object对象是通过equals和hashCode来进行过滤的. 如果将上一篇提到中的例子中的TreeSet,换成HashSet,那么 ...

  3. 【leetcode】74. Search a 2D Matrix & 240. Search a 2D Matrix II

    题目如下:这两个题目可以用同样的代码来解答,因此就合并在一起了. 题目一: 题目二: 解题思路:两个题目的唯一区别在于第二个题目下一行的最小值不一定会小于前一行的最大值.但是不管怎么样我们可以确定的是 ...

  4. CSS3画五角星和六角星

    最终想要实现的效果 一.五角星 在画五角星之前首先分析这个五角星是如何实现,由哪几个部分构成的,示意图如下: 三个顶角向上的三角形,通过设置旋转和定位相互重叠和拼接实现最终的五角星效果. 为了语义化和 ...

  5. 2019年开发App记录

    Pod 制作私有库参考 https://www.jianshu.com/p/f903ecf8e882 Pod私有库的升级 改代码部分,到Example文件夹执行pod install ,修改XXX.s ...

  6. java获取当前时间的年周月季度等的开始结束时间

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created b ...

  7. Codeforces Round #603 (Div. 2) E. Editor

    E. Editor 题目链接: https://codeforces.com/contest/1263/problem/E 题目大意: 输入一个字符串S1含有‘(’ , ‘)’ , ‘R’ , ‘L’ ...

  8. java读取ldif文件并创建新的节点

    所需jar包ldap.jar. jldap-4.3-source.jar http://www.java2s.com/Code/Jar/l/Downloadldapjar.htm 浏览器输入http: ...

  9. [CSP-S模拟测试]:大佬(kat)(数学期望)

    题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.他发现$katarina$大佬真是太强了,于是就学习了一下$katarina$大佬的做题方法.比如这是一本有$n$道题的练习册,$ ...

  10. java的基本数据类型有

    整型数据根据它所占内容大小的不同可分为4种类型. 数据类型 内存 byte 8位 short 16位 int 32位 long 64位 浮点类型 数据类型 内存 float 32位 double 64 ...