题意:给出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 ;
}

最新文章

  1. WiFi流量劫持—— JS脚本缓存投毒
  2. Linux常用的安全工具 转自https://yq.aliyun.com/articles/52540?spm=5176.100239.blogcont24250.8.CfBYE9
  3. 基于jquery的图片轮播 (IE8以上)
  4. 【问题排查】StringIndexOutOfBoundsException
  5. tensorflow1
  6. Linux系统常用命令
  7. Maven - 解决Maven下载依赖包速度慢问题
  8. STM32 SPI DMA 的使用
  9. 使用EntityFramework6连接MySql数据库
  10. mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别
  11. noi2006day2_最大获利 网络流
  12. 【BZOJ 1013】 [JSOI2008]球形空间产生器sphere
  13. mysql数据库 数据类型
  14. Hive插数据报错
  15. 微信小程序-获取地理位置
  16. python 通用装饰器,带有参数的装饰器,
  17. 小程序 青少儿书画 利用engineercms作为服务端
  18. RHEL6.2的安装文档
  19. js如何调试,使用debug模式
  20. java基础篇---文件上传(commons-FileUpload组件)

热门文章

  1. 【06月04日】A股滚动市盈率PE历史新低排名
  2. 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
  3. 数据对象如何定义为Java代码示例
  4. C#实现ActiveMQ消息队列
  5. 当Windows操作系统关机时,不会执行Windows Service的OnStop方法(转载)
  6. 阿里云RDS数据库sql server 导入数据并添加作业小结
  7. azure 上传blob到ams(CreateFromBlob)
  8. Vert.x(vertx)发送 HTTP/HTTPS请求
  9. Nginx配置单项SSL以及双向SSL
  10. 2019-07-30 ThinkPHP文件上传