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& ...
随机推荐
- GitHub 被指审查内容,著名“换脸”开源项目 deepfake 遭限制访问
开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 昨天 Hacker News 上一条关于 deepfake 开源项目的帖子(https://news.ycombi ...
- Mark一篇介绍Java垃圾回收和JVM参数设置的文章
贴出原文连接:重磅!Java 内存管理白皮书,读完它,java 内存管理的问题完全 NO Problem! 读了一遍,对并行的垃圾回收还不是很理解,先mark,消化消化再学习. 文章说的一些JVM设置 ...
- USACO Training Section 1.1 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- pycharm(py 文件中添加作者、时间)
1.打开 Pycharm,点击 File,再找到 Settings... 2.选择 Editor ----> File and Code Templates ----> Python Sc ...
- Composition API
介绍 Composition API的主要思想是,我们将它们定义为从新的 setup 函数返回的JavaScript变量,而不是将组件的功能(例如state.method.computed等)定义为对 ...
- php5与php7安全性的区别
0X01 前言 本篇文章大多为转载,但是修正了一些不正确的说法,对某些功能点的变更指出具体是哪个版本变更,加入了一些小更新. (原文地址:https://www.freebuf.com/article ...
- OpenWrt(LEDE)2020.4.29更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成+软件包
交流群:QQ 1030484865 电报: t_homelede 固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.29)Lienol Feed及若干自行维护 ...
- 【Hadoop离线基础总结】Hue与Hive集成
目录 1.更改hue的配置hue.ini 2.启动hive的metastore以及hiveserver2服务 3.启动hue进程,查看Hive是否与Hue集成成功 1.更改hue的配置hue.ini ...
- uCOS2014.1.11
typedef unsigned char BOOLEAN;typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ty ...
- 想要年薪百万,阿里Sentinel支持RESTful接口都搞不定?
最近正准备用阿里Sentinel,发现RESTful接口支持的不是很好.有些童鞋可能对Sentinel不是很了解,我们先简单介绍一下. Sentinel简介 Sentinel是一套阿里巴巴开源的流量防 ...