题意:给出A数组,B数组,你可以对A和B分别进行重排列,使得C[i]=A[i]^B[i]的字典序最小。

思路:对于这类题,显然需要建立字典树,然后某种形式取分治,或者贪心。  假设现在有了两颗字典树A,B,显然尽量让同方向的先匹配。

而且同一棵树的左右两边相互不影响,所以可以直接贪:如果A树上出发左走有x个数字,B左走有y个数字,那么一定会左匹配min(x,y);右匹配同理; 剩下的交叉匹配;

看代码应该就会看懂了:add建立字典树。

dfs进行匹配;  (i,j)从前往后分别是,(0,0) (1,1),(0,1) (1,0)保证了相同的先匹配。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int ch0[maxn*][],ch1[maxn*][],tot0,tot1;
int ans[maxn],num,sum0[maxn*],sum1[maxn*];
void init()
{
rep(i,,tot0) rep(j,,) ch0[i][j]=;
rep(i,,tot1) rep(j,,) ch1[i][j]=;
tot0=tot1=num=;
}
void add(int ch[][],int sum[],int x,int &tot)
{
for(int i=,now=;i>=;i--){
int t=(x>>i)&;
if(!ch[now][t]) ch[now][t]=++tot;
now=ch[now][t];
sum[now]++;
}
}
void dfs(int now0,int now1,int cost,int dep)
{
int e=min(sum0[now0],sum1[now1]);
sum0[now0]-=e; sum1[now1]-=e;
if(dep==-) {
rep(i,,e) ans[++num]=cost;
return ;
}
rep(k,,){
int i=k&,j=i^; if(k<=) j=i;
if(sum0[ch0[now0][i]]&&sum1[ch1[now1][j]])
dfs(ch0[now0][i],ch1[now1][j],cost+(i==j?:(<<dep)),dep-);
}
}
int main()
{
int T,N,x;
scanf("%d",&T);
while(T--){
init();
scanf("%d",&N);
rep(i,,N){
scanf("%d",&x);
add(ch0,sum0,x,tot0);
}
rep(i,,N){
scanf("%d",&x);
add(ch1,sum1,x,tot1);
}
dfs(,,,);
sort(ans+,ans+N+);
rep(i,,N-) printf("%d ",ans[i]);
printf("%d\n",ans[N]);
}
return ;
}

HDU6625: three arrays (字典树处理xor)的更多相关文章

  1. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  2. 字典树-THE XOR largest pair

    题目:给你n个数字A1,A2....An ,问从中选出两个数字异或运算得到的最大结果是多少 0<=Ai<231 用字典树,记录每个数字的31位2进制01串(int 为4个字节,每个字节8个 ...

  3. 字典树 && 例题 Xor Sum HDU - 4825 (板子)

    一.字典树描述:Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...

  4. 双01字典树最小XOR(three arrays)--2019 Multi-University Training Contest 5(hdu杭电多校第5场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625 题意: 给你两串数 a串,b串,让你一一配对XOR使得新的 C 串字典序最小. 思路: 首先这边 ...

  5. [2019杭电多校第五场][hdu6625]three arrays(01字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625 大意为给你两个数组a和b,对应位置异或得到c数组,现在可以将a,b数组从新排序求c数组,使得字典 ...

  6. three arrays HDU - 6625 (字典树)

    three arrays \[ Time Limit: 2500 ms \quad Memory Limit: 262144 kB \] 题意 给出 \(a\),\(b\) 数组,定义数组 \(c[i ...

  7. hdu5536 字典树xor

    一想到xor还要求最大类似的题,字典树效率高. 此代码c++ TLE. #include<stdio.h> #include<string.h> ; struct node { ...

  8. HDU 4825 Xor Sum(经典01字典树+贪心)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  9. 字典树-百度之星-Xor Sum

    Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...

随机推荐

  1. kali 更改图标村大小

    1.“设置” --> "通用辅助功能" --> "大号字体" 2.在终端中输入 “gnome-tweaks” 打开 优化 --> 扩展  -- ...

  2. SQL Server ----- 还原数据库,将另一台电脑上的数据库装在本机

    1.创建好数据库,记住安装位置,,和需要还原的数据库的位置 还原数据库的意思就是 根据创建的数据库,还原备份的数据库,如果数据库中没有数据库要新建数据库. 2.进来后如图 3.找你需要的还原数据库的位 ...

  3. 数据库权限优化,权限设计BigInteger

    最近看到了一个项目的权限是根据bigineger来进行计算的菜单权限,觉得还是不错,存储上只需要存储在一个字段里就可以了,通过计算算出该角色的菜单权限即可,效率也非常的快,放在session中也非常的 ...

  4. 运行带有Activiti modeler时,出现这样的报错: java.rmi.AccessException: Cannot modify this registry

    最近在做整合Activiti Modeler工作流在线设计器的工作,运行IDEA时,出现了这样一个错误信息: 原因及解决办法:   Activiti默认打开了jmx功能,默认端口为1099,idea中 ...

  5. The instance of entity type 'Menu' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.

    这里记录一个在使用.net core中ef core执行数据库操作时遇到的问题: 我在代码中使用DbContext下的Update方法准备将更改后的数据像这样步到数据库: _context.Menus ...

  6. [MySql] - Windows MySql 8.x 手动zip包安装与外网访问登录权限设定

    MySql 8.x官方下载地址 https://dev.mysql.com/downloads/mysql/8.0.html https://cdn.mysql.com//Downloads/MySQ ...

  7. vuejs应用开发前后端分离

    我们知道,无论是web应用还是app应用都有一个前后端,前端主要负责界面交互,后端负责数据持久化.在正规公司中一般是由两个团队来分别完成前端和后端的开发,在小公司或者个人开发的项目中,前后端很有可能是 ...

  8. [转]解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) ’ 问题

    当运行sudo apt-get install/update/其他命令时,会出现如下提示: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不 ...

  9. 31、splice()用法

    改变数组,向数组中添加/删除元素: eg: 1.删除元素: let arr=['bob','lily','bike','sam']; arr.splice(2,1) console.log(arr) ...

  10. PHPSocket.IO知识学习整理

    一.服务端和客户端连接 1.创建一个SocketIO服务端 <?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\ ...