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& ...
随机推荐
- 基于docker-compose部署LNMP
一.配置环境 [root@docker ~]# systemctl stop firewalld[root@docker ~]# iptables -F[root@docker ~]# setenfo ...
- Gym 101194D Ice Cream Tower
被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...
- Android环境配置----在Ubuntu上安装JDK
jdk download address: jdk-6u22-linux-i586.bin http://www.oracle.com/technetwor ... ownloads/index.ht ...
- H5 -- 取消a标签在点击时的背景颜色
原文链接:点我 1.取消a标签在移动端点击时的蓝色 a { -webkit-tap-highlight-color: rgba(255, 255, 255, 0); -webkit-user-sele ...
- 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本
接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...
- POJ 3267为什么优先队列超时,DP就能过,难过
The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11846 Accepted: 5693 Desc ...
- Web 跨域请求问题的解决方案- CORS 方案
1.什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域: 跨域现象 实例 域名不相同 www.baidu.com与www.taobao 一级域名相同,但是端口不相同 www.baidu.com:80 ...
- 【Swift】获取UILabel中点击的某个功能标签文字并作出响应动作
1.需求 首先.针对UILabel中显示的多个功能标签,作出颜色标记提示. 其次.对关键字作出点击响应动作. 如图所示: 解决: 1.使用正则匹配到关键字 public static var hash ...
- neo4j在docker容器环境中无法启动的问题
回去过了个周末,neo4j就无法启动了 数据还没备份出来,着急啊.上周回去前刚刚在研究怎么把数据导出来,尝试了一些容器导出的方法,没有成功.周一回来就无法启动了... 表现为启动后过几十秒又变为sto ...
- MongoDB最佳安全实践
在前文[15分钟从零开始搭建支持10w+用户的生产环境(二)]中提了一句MongoDB的安全,有小伙伴留心了,在公众号后台问.所以今天专门开个文,写一下关于MongoDB的安全. 一.我的一次Mong ...