转自:https://blog.csdn.net/zuzhiang/article/details/79872805
01 字 典 树 主 要 用 于 解 决 求 异 或 最 值 的 问 题 。 01字典树主要用于解决求异或最值的问题。 01字典树主要用于解决求异或最值的问题。
1. 01字典树是一棵二叉树,每条节点的两条边分别表示二进制的某一位值是0还是1,
2. 将某个从根节点出发路径上边的值连起来就可以得到一个二进制串,这个二进制串是从根节点出发且最高位靠与根节点相连
3. 通过贪心的策略来寻找与x异或结果最大的数,即优先找和 x二进制的未处理的最高位值不同的边对应的点,这样保证结果最大
4. 这张图片讲的是在最大为4位二进制,3,4,5 是怎么插在01字典树上,以及val怎么存
配合下面模板和 https://cn.vjudge.net/problem/HDU-4825 请看这张图
int tol; //节点个数
LL val[32*MAXN]; //点的值
int ch[32*MAXN][2]; //边的值
void init()
{
//初始化
tol=1;
ch[0][0]=ch[0][1]=0;
}
void insert(LL x)
{
//往 01字典树中插入 x
int u=0;
for(int i=32;i>=0;i--)
{
int v=(x>>i)&1;
if(!ch[u][v])
{
//如果节点未被访问过
ch[tol][0]=ch[tol][1]=0; //将当前节点的边值初始化
val[tol]=0; //节点值为0,表示到此不是一个数
ch[u][v]=tol++; //边指向的节点编号
}
u=ch[u][v]; //下一节点
}
val[u]=x; //节点值为 x,即到此是一个数
}
LL query(LL x)
{
//查询所有数中和 x异或结果最大的数
int u=0;
for(int i=32;i>=0;i--)
{
int v=(x>>i)&1;
//利用贪心策略,优先寻找和当前位不同的数
if(ch[u][v^1]) u=ch[u][v^1];
else u=ch[u][v];
}
return val[u]; //返回结果
}
https://cn.vjudge.net/problem/HDU-4825
#include <bits/stdc++.h>
using namespace std;
#define maxn 100000
#define ll long long
int tol;
ll val[32*maxn];
int ch[32*maxn][2];
void init(){
tol=1;
ch[0][0]=ch[0][1]=0;
}
void insert(ll x){
int u=0;
for(int i=32;i>=0;i--){
int v=(x>>i)&1;
if(!ch[u][v]){
ch[tol][0]=ch[tol][1]=0;
val[tol]=0;
ch[u][v]=tol++;
}
u=ch[u][v];
}
val[u]=x;
}
ll query(ll x){
int u=0;
for(int i=32;i>=0;i--){
int v=(x>>i)&1;
if(ch[u][v^1]) u=ch[u][v^1];
else u=ch[u][v];
}
return val[u];
}
int main(){
int T,n,m;
ll a;
scanf("%d",&T);
for(int s=1;s<=T;s++){
init();
scanf("%d %d", &n, &m);
for(int i=0;i<n;i++){
scanf("%lld", &a);
insert(a);
}
printf("Case #%d:\n", s);
for(int i=0;i<m;i++){
scanf("%lld", &a);
printf("%d\n", query(a));
}
}
}
前言想必很多人在为接下来的金九银十做准备,或许你只是想找到一份工作,亦或许你希望通过今年最后这波拿到一个理想的工作和薪酬。不管是哪一种情况,你都需要提前做好准备,而不是临时抱佛脚。LZ为大家分享的这些面试真题一定要基于自己的技术栈来思考,而不是背一下就觉得这个我会了。试想一下,如果面试官接着往深处问,你能保证自己回答的上来吗?这样的跳槽方式在以前或许还比较适用,但是在今年一定是没有效果的,没有意义的。LZ把这350道Java面试真题分成了五大专题,分别是:性能优化、微服务架构、并发编程(高级)、开源框
由于手工修改编译了sys.DBMS_DATAPUMP的start_job里cluster_ok的默认参数值,1为0,编译成功后,导致导出报错。ORA-04063: package body "SYS.DBMS_DATAPUMP" has errorsSQL> CREATE TABLE "test" 2 ( " " VARCHAR2(255), "YPID" VARCHAR2(255));Table created.SQL> insert into "tes...
<br />最近继续用ASP.Net来重新开发ACM的Online Judge系统,因为要进行进程的监控,所以自己编写了一个非托管的DLL供ASP.Net调用。<br />我用的是VS2005的开发环境,后来发现使用[DllImport("Judge.dll")]后提示 无法加载 DLL “Judge.dll” 找不到指定的模块<br />我这时是把Judge.dll拷贝到Bin目录下的,但仍然提示找不到DLL,在工程里添加DLL引用的时候,发现添加这个非托管DLL就会令VS2005异常退出(上网搜索后也
单例模式(Singleton Pattern) 软件工程中,单例模式是限制一个类仅有一个实例对象。这在当系统中仅需一个对象进行协调动作时是非常有用的。这个概念是有时系统的操作当仅有一个对象时更加有效。或者严格限制对象实例的数量。这一概念是来自于数学中的单例的概念。 批评者认为,单例模式是...
随着企业固态驱动器(SSD)在系统性能和更小的外形尺寸方面不断前进,SSD解决方案提供商面临着更大的挑战。在提高密度及耐用性,性能和添加重要的新功能的同时,还需要继续保护飞行中的数据免受电源故障的影响。通过使用更多具有更快接口速度的闪存通道和更高密度的闪存设备,下一代SSD将迅速增长到32TB甚至更高。如果采用具有DRAM工作存储器的控制器的传统体系结构,这将大大增加对能量存储以提供电源故障保护...
我想设置按钮的背景色.我正在将Visual Studio与Xamarin一起使用.在Android中,我们使用:Java代码:button_vstrong_fluorescence.setBackgroundColor(ContextCompat.getColor(InventoryActivity.this, R.color.linear_filter_background));但是在Xamar...
Linux编程点击右侧关注,免费入门到精通!作者丨沐风「joymufeng」https://my.oschina.net/joymufeng/blog/2251038有个...
摘要 通过对SSL握手协议的分析,得知在SSL双向认证握手过程中,客户端需要出示客户端证书以供服务器验证,利用sniffer技术截获网络通信过程中的TCP/IP数据包,通过对TCP/IP数据包的解析,获得客户端证书公钥。 关键字:sniffer,SSL 握手协议,TCP/IP, 证书公钥 相关工具:Ethereal:网络抓包工具,Ethere
使用fiddler模拟弱网络环境测试在工具栏中找到Rules,再到Rules列表中找到Customize Rules。在弹出的文本编辑器中使用Ctrl+F使用搜索功能搜索关键字:simulate,定位到如下代码段:if (m_SimulateModem) { // Delay sends by 300ms per KB uploaded. oSession["request...
关于RGB、YUY2、YUYV、YVYU、UYVY、AYUV DirectShow中常见的RGB/YUV格式小知识:RGB与YUV----摘自《DirectShow实务精选》 作者:陆其明计 算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)、G(Green)、B(Blue)相加混色的原理:通过发射出三种不同强度的电子 束,使屏幕内侧覆盖的红、绿
React Native是什么 Facebook于2015年9月15日发布React Native,广大开发者可以使用JavaScript和React开发跨平台移动应用,React Native提倡组件化开发,即提供一个个封装好的组件,然后组件相互嵌套形成新的组件。 它充分利用了Facebook现有的业务轮子, 其核心设计理
该种形式出现于结构体或共用体的定义中,是位域定义的标准形式。其使用方式为struct name{type var_name : n;};含义为,在结构体name汇总,成员变量var_name占用空间为n位。n为正整数,其值必须小于type类型占用的位数。比如type如果是int,占4字节32位,那么n必须是1~31之间的整数。对于位域类型的成员,在赋值时如果实际值超过n位所能表达的范围,那么超出部...