CF1285D. Dr. Evil Underscores(字典树)

2024-04-16 02:08

本文主要是介绍CF1285D. Dr. Evil Underscores(字典树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Today, as a friendship gift, Bakry gave Badawy 𝑛 integers 𝑎1,𝑎2,…,𝑎𝑛 and challenged him to choose an integer 𝑋 such that the value max1≤𝑖≤𝑛(𝑎𝑖⊕𝑋) is minimum possible, where ⊕ denotes the bitwise XOR operation.

As always, Badawy is too lazy, so you decided to help him and find the minimum possible value of max1≤𝑖≤𝑛(𝑎𝑖⊕𝑋).

Input
The first line contains integer 𝑛 (1≤𝑛≤105).

The second line contains 𝑛 integers 𝑎1,𝑎2,…,𝑎𝑛 (0≤𝑎𝑖≤230−1).

Output
Print one integer — the minimum possible value of max1≤𝑖≤𝑛(𝑎𝑖⊕𝑋).

Examples
inputCopy
3
1 2 3
outputCopy
2
inputCopy
2
1 5
outputCopy
4
Note
In the first sample, we can choose 𝑋=3.

In the second sample, we can choose 𝑋=5.

题意:
给出n个数,求出所有数与这n个数异或后结果的最大值,这些最大值的最小值。
思路:
143. 最大异或对(字典树)acwing

  • 异或的最大值,很明显是字典树。X是任意的,我们需要用字典树来维护这个最大值。
  • 因为异或是同性相斥,异性相吸,那么对所有的数建完字典树,取0,往1走的最大值,取1,往0走得最大值,如果只有一个数,就可以取相同的数,答案就是确定的。
  • 相当于,当前位有两个选择的时候,X怎么取,这个位都要得1,结果就是2的n次方。如果只有一个选择,那么这个位可以得0。按照这个思路,在字典树上递归的写就好了。关键点就在于,通过维护二进制每一个位上的数字0和1,再根据二进制规律进行运算。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;
typedef long long ll;int n;
int a[100005],t[7000005][3],tot = 1;void insert(int val)
{int p = 1;for(int i = 29;i >= 0;i--){int ch = (val >> i) & 1;if(t[p][ch] == 0){t[p][ch] = ++tot;}p = t[p][ch];}
}int solve(int cnt,int now)
{if(cnt == -1){return 0;}if(t[now][0] == 0){return solve(cnt - 1,t[now][1]);}else if(t[now][1] == 0){return solve(cnt - 1,t[now][0]);}else return (1 << cnt) + min(solve(cnt - 1,t[now][0]),solve(cnt - 1,t[now][1]));
}int main()
{scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&a[i]);insert(a[i]);}int ans = solve(29,1);printf("%d\n",ans);return 0;
}

边建树边递归的写法

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;
typedef long long ll;
int n;int solve(vector<int>a,int cnt)
{if(cnt == -1){return 0;}vector<int>a0,a1;int len = (int)a.size();for(int i = 0;i < len;i++){if((a[i] >> cnt) & 1){a1.push_back(a[i]);}else{a0.push_back(a[i]);}}if(a0.size() == 0){return solve(a1,cnt - 1);}else if(a1.size() == 0){return solve(a0,cnt - 1);}else return (1 << cnt) + min(solve(a1,cnt - 1),solve(a0,cnt - 1));
}int main()
{scanf("%d",&n);vector<int>a;for(int i = 1;i <= n;i++){int tmp;scanf("%d",&tmp);a.push_back(tmp);}int ans = solve(a,29);printf("%d\n",ans);return 0;
}

这篇关于CF1285D. Dr. Evil Underscores(字典树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907536

相关文章

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

dr 航迹推算 知识介绍

DR(Dead Reckoning)航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术,用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数(如速度、方向)来预测物体的当前位置。以下是 DR 航迹推算的详细知识介绍: 1. 基本概念 Dead Reckoning(DR): 定义:通过利用已知的当前位置、速度、方向和时间间隔,计算物体在下一时刻的位置。应用:用于导航和定位,

python 实现第k个字典排列算法

第k个字典排列算法介绍 "第k个字典排列"算法通常指的是在给定的字符集合(例如,字符串中的字符)中,找到所有可能排列的第k个排列。这个问题可以通过多种方法解决,但一个常见且高效的方法是使用“下一个排列”算法的变种,或称为“第k个排列”的直接算法。 方法一:使用“下一个排列”的变种 生成所有排列:首先生成所有排列,但显然这种方法对于较大的输入集合是不切实际的,因为它涉及到大量的计算和存储。 排序

POJ3617(字典序最小问题)

书中43页 此题有坑点,PE了40分钟.也是醉了....题目要求每80个字符才换行,而且最后一个如果恰好就不用换,这不是无聊嘛....... #include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,m;char S[2100],P[2100];int main(){#ifd

POJ 2001 Shortest Prefixes(字典树入门)

题目: http://poj.org/problem?id=2001 题意: 找到多个字符串中,各自唯一的最短子串,例如 carte 与 carce 各自唯一的最短子串为cart与carc,即不会与其它字符串的子串重复。 思路: 字典树 解题心得: 更新关键值的时机很重要 代码: #include<stdio.h>#include<string>typedef str

Oracle数据库(数据字典、表空间、表的创建、视图)

知识点引用: http://www.2cto.com/database/201207/142874.html http://blog.csdn.net/haiross/article/details/11772847 一. 彻底卸载Oracle 方式1、重装操作系统 方式2、 2.1 DBCA删除数据库开始 → 程序 → Oracle → 开发与移植工具 → Datab

Python的字符串,list,tuple,set,字典操作详解

1.字符串python是要创建成字符串的元素,其中的每个字母都是单一的子串,把它放在' '单引号或是'' ''引号中,就完成了python 字符串的创建。#str强制转换>>> a=123>>> b=str(a) #将整数转化为字符串>>> b'123'>>> a=[1,2,3]>>> b=str(a) #将list转化为字符串>>> b'[1, 2, 3]'#字符串下

OC中数组、字典、集合常用方法的运用

/* ====================== 一 NSArray========================          1.创建对象          1.1初始化方法(2) //一般程序有问题先检查初始化          1.2类方法          1.3字面量方法          2.数组查找          2.1通过下标访问对象[ .[i]]

python pickle 模块用于保存python内存数据(包括实例对象、字典、列表等所有python中的数据)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言基本用法 前言 Python 的 pickle 模块用于序列化和反序列化 Python 对象。这意味着你可以将 Python 对象(如列表、字典、类实例等)转换为字节流(序列化),并将其保存到文件中或在网络上传输,然后在需要的时候将其恢复为原始 Python 对象(反序列化)。 常见用途

Python 从入门到实战8(字典)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。       上篇文章我们通过举例学习了python 中元组的定义及相关操作。今天详细讲述字典的定义及相关的操作,也是经常使用到的。 1、字典的定义 字典是由{}括住的,内容以“键-值对”的形式存储的无序序列。 字典的主要特点如下: