CF948D Perfect Security
题目链接:http://codeforces.com/contest/948/problem/D
知识点: Trie
题目大意:
给出两个长度为 \(N(1 \le N \le 300000)\) 的数组 \(A\) 和 \(P(0 \le A_{i},P_{i} \le 2^{30}\). 数组 \(P\) 可置换顺序,置换后得到数组 \(B(B_{i} = A_{i} \oplus P_{i})\),求能得到的字典序最小的数组 \(B\).
解题思路:
把数组 \(P\) 和 \(A\) 中的每一个数都视为带有前导零的 \(31\) 位二进制数。
将 \(P\) 中的每一个数由高位到低位插入字典树中。
依次遍历 \(A\) 中的每一个数,查询字典树中最适合与这个数异或的数(即二进制表示中不同的位最少并且高位尽可能相同的数),返回这个数(同时在字典树中将该数删除)。
AC代码:
#include <bits/stdc++.h> using namespace std;
const int maxn = +;
int A[maxn]; struct Trie{
int ch[maxn*][];
int val[maxn*],nm[maxn*];
int sz;
Trie(){
sz=;
memset(ch[],,sizeof(ch[]));
memset(val,,sizeof(val));
memset(nm,-,sizeof(nm));
}
void inserts(int num){
int u=;
for(int i=;i>=;i--){
int nx;
if(num&(<<i))
nx=;
else
nx=;
if(!ch[u][nx]){
memset(ch[sz],,sizeof(ch[sz]));
ch[u][nx]=sz;
sz++;
}
u=ch[u][nx];
val[u]++; //val 记录经过该结点的数字的个数
}
nm[u]=num; //nm 记录该叶子结点对应数字
}
int query(int num){
int u=;
for(int i=;i>=;i--){
int nx;
if(num&(<<i))
nx=;
else
nx=;
if(ch[u][nx]&&val[ch[u][nx]])
u=ch[u][nx]; //保证高位尽可能相同
else
u=ch[u][nx^];
val[u]--;
}
return nm[u];
}
};
Trie ac;
int main(){
int N;
scanf("%d",&N);
for(int i=;i<N;i++)
scanf("%d",&A[i]);
int num;
for(int i=;i<N;i++){
scanf("%d",&num);
ac.inserts(num);
}
for(int i=;i<N;i++){
if(i!=) printf(" ");
printf("%d",ac.query(A[i])^A[i]);
}
return ;
}
CF948D Perfect Security的更多相关文章
- Codeforces 948D Perfect Security(字典树)
题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...
- 【CodeForces】947 C. Perfect Security 异或Trie
[题目]C. Perfect Security [题意]给定长度为n的非负整数数组A和数组B,要求将数组B重排列使得A[i]^B[i]的字典序最小.n<=3*10^5,time=3.5s. [算 ...
- 01Trie树 CF923C Perfect Security
CF923C Perfect Security 上下各n个数,求一种排列p,使上面的数i异或pi成为新的数i,求方案另字典序最小,输出该结果 01Trie树. 记录每个节点经过多少次. 每一次查询的时 ...
- CodeForces 923C Perfect Security
C. Perfect Security time limit per test3.5 seconds memory limit per test512 megabytes inputstandard ...
- Codeforces 948D Perfect Security
Perfect Security 题意:给你一个A[i]数组, 再给你一个B[i]数组, 现在用选取 B[i] 数组中的一个 去和 A[i] 数组里的一个元素去进行异或操作, B[i]数组的元素只能用 ...
- Codeforces 948D Perfect Security 【01字典树】
<题目链接> 题目大意: 给定两个长度为n的序列,可以改变第二个序列中数的顺序,使得两个序列相同位置的数异或之后得到的新序列的字典序最小. 解题分析: 用01字典树来解决异或最值问题.因为 ...
- 2018.12.08 codeforces 948D. Perfect Security(01trie)
传送门 01trie板子题. 给出两个数列,允许把第二个数列重新排列. 求使得两个数列每个位置对应的数的异或值和成为最小值的每个位置的异或和. 把第二个数列插入到01trie里面然后对于第一个数列中的 ...
- Codeforces 923 C. Perfect Security
http://codeforces.com/contest/923/problem/C Trie树 #include<cstdio> #include<iostream> us ...
- 923c C. Perfect Security
Trie树. 要求字典序最小,所以由前到后贪心的选择.建一个trie树维护b数列. #include<cstdio> #include<algorithm> #include& ...
随机推荐
- Vs Code中炫酷写代码插件Power Mode的安装配置
扩展栏搜索 Power Mode 安装 安装后重启vs code 文件->首选项->设置 搜索setting.json,点击在setting.json中编辑 打开之后在右侧用户设置里添加以 ...
- Netty(五):ServerBootstrap启动流程
这篇文章主要是对ServerBootstrap启动流程做一个梳理,方便我们串联起各个类,同时也对主要的一些类有个大概的印象,方便之后逐个类的深入学习. 本篇文章不在具体贴出代码,而是对整个启动流程画了 ...
- Java ArrayList工作原理及实现
http://yikun.github.io/2015/04/04/Java-ArrayList%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE% ...
- Linux运维面试题:请简要说明Linux系统在目标板上的启动过程?
Linux运维面试题:请简要说明Linux系统在目标板上的启动过程? 该问题是Linux运维面试最常见的问题之一,问题答案如下: 1.用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备( ...
- Java pdf转高清图片
为什么80%的码农都做不了架构师?>>> package com.hyb.kai.web.controller; import java.awt.image.BufferedIm ...
- Process Synchronization-Example 1
问题描述 把学生和监考老师都看作进程,学生有N人,教师1人.考场门口每次只能进出一个人,进考场原则是先来先进.当N个学生都进入考场后,教师才能发卷子.学生交卷后可以离开考场,教师要等收上来全部卷子并封 ...
- Eclipse中获取html jsp 标签的属性提示信息方法
操作方法: windows------preferences----------搜索 html----------找到 html Source这项---------找到 content assist ...
- Android EventBus踩坑,Activity接收不了粘性事件。
注解问题 EventBus 的 粘性事件,可以让 成功注册后的 Activity.Fragment 后再接收处理 这一事件. 但是今晚写代码时,突然发现粘性事件,发送不成功了.??? 具体情况是:我在 ...
- FarmCraft
题意:mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子.mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒软件,第i个妹子安装时间为ci.树上的每 ...
- springboot配置静态资源访问路径
其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...