01字典树 详解「建议收藏」

01字典树 详解「建议收藏」欢迎关注我的个人博客:www.zuzhiang.cn以前只知道字典树可以降低空间复杂度,今天无意中接触了01字典树,原来可以用它来降低时间复杂度,下面我就来给大家介绍一下01字典树的原理和应用。01字典树主要用于解决求异或最值的问题。我先放上简单的模板,然后再讲解它的原理。inttol;//节点个数LLval[32*MAXN];//点的值i…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

欢迎关注我的个人博客:www.zuzhiang.cn

 

以前只知道字典树可以降低空间复杂度,今天无意中接触了 01字典树,原来可以用它来降低时间复杂度,下面我就来给大家介绍一下 01字典树的原理和应用。

 

 

01字典树主要用于解决求异或最值的问题。我先放上简单的模板,然后再讲解它的原理。

 

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]; //返回结果 
}

01字典树和普通的字典树原理类似,只不过把插入字符改成了插入二进制串的每一位(0或1)。

 

通过上面的代码,我们可以发现有下面几个事实:

 

1. 01字典树是一棵最多 32层的二叉树,其每个节点的两条边分别表示二进制的某一位的值为 0 还是为 1. 将某个路径上边的值连起来就得到一个二进制串。

2.节点个数为 1 的层(最高层)节点的边对应着二进制串的最高位。

3.以上代码中,ch[i] 表示一个节点,ch[i][0] 和 ch[i][1] 表示节点的两条边指向的节点,val[i] 表示节点的值。

4.每个节点主要有 4个属性:节点值、节点编号、两条边指向的下一节点的编号。

5.节点值 val为 0时表示到当前节点为止不能形成一个数,否则 val[i]=数值。

6.可通过贪心的策略来寻找与 x异或结果最大的数,即优先找和 x二进制的未处理的最高位值不同的边对应的点,这样保证结果最大。

 

 

例题:

一、HDU 4825

传送门:HDU 4825

题目大意:在一组数中找跟某个数异或结果最大的数。

题解:直接套用模板,将数组中的数插入到 01字典树,对每一个数查询即可。

 

二、HDU 5536

传送门:HDU 5536

题目大意:在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。

题解:HDU 5536 题解

 

 

三、BZOJ 4260

传送门:BZOJ 4260

题目大意:给你 n 个数,让你求两个不相交的区间元素异或后的和的最大值。

题解:BZOJ 4260 题解

 

 

四、POJ 3764

传送门:POJ 3764

题目大意:在树上找一段路径(连续)使得边权相异或的结果最大。

题解:POJ 3764 题解

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196363.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言怎么使用strstr函数,c语言中strstr函数的用法是什么?[通俗易懂]

    c语言怎么使用strstr函数,c语言中strstr函数的用法是什么?[通俗易懂]c语言中“strstr(str1,str2)”函数用于判断字符串“str2”是否是“str1”的子串;如果是,则该函数返回“str2”在“str1”中首次出现的地址;否则返回NULL。其语法为“*strstr(str1,str2)”。strstr(str1,str2)函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。C语…

    2022年10月15日
    3
  • django3.0异步_定时任务框架

    django3.0异步_定时任务框架celery介绍Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。Celery侧重

    2022年7月31日
    8
  • 【灯哥开源四足机器人】推荐一个开源四足机器狗项目,8自有度,两个舵机控制一个腿,apache开源协议的,已经迭代了好多个版本了,设计的非常好。有官方淘宝店,没有3D打印机的可以购买散装零件自己组装[通俗易懂]

    【灯哥开源四足机器人】推荐一个开源四足机器狗项目,8自有度,两个舵机控制一个腿,apache开源协议的,已经迭代了好多个版本了,设计的非常好。有官方淘宝店,没有3D打印机的可以购买散装零件自己组装[通俗易懂]目录前言1,关于【灯哥开源四足机器人】2,使用py-apple3,总结前言本文的原文连接是:https://blog.csdn.net/freewebsys/article/details/108971807未经博主允许不得转载。博主地址是:http://blog.csdn.net/freewebsys1,关于【灯哥开源四足机器人】灯哥开源的四足机器人(不是我)。作者的主页:https://www.bilibili.com/video/BV1Ka4y1t7CLgithub首页:h

    2022年6月9日
    70
  • rapidjson指针[通俗易懂]

    rapidjson指针[通俗易懂]博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjson指针/本系列文章以例子的方式进行呈现。#include”rapidjson/document.h”#include”rapidjson/pointer.h”#include<iostream>usingnamespacerapidjson;/…

    2025年7月13日
    2
  • 手机游戏开发现状分析[通俗易懂]

    手机游戏开发现状分析[通俗易懂]随着近年来手机的日渐普及,手机游戏已经成为整个游戏领域发展速度最快的部分。根据英国某媒体研究公布的统计数据,今年的手机游戏市场的产值已经达到5.87亿美元,比去年年翻了一番。该公司预计到今后几年里这一市场的产值将达到目前的6倍,增至38亿美元。 我国的手机游戏在最近一年,也有了长足的发展。但是就其规模而言,还远远没有达到国外的水平。这其中原因很多,但有一点是可以肯定的,我国的手机游戏前景是光明

    2022年4月30日
    42
  • CSS改变鼠标样式(图片)

    CSS改变鼠标样式(图片)下面就来介绍下步骤方法:首页把鼠标图标格式转换成.ico格式,大小为32*32转换格式网址为:https://www.easyicon.net/covert/然后在CSS样式中增加代码:*{cursor:url(../images/shubiao.ico),auto;}大功告成啦~~~说明:图片大小最好是32*32的大小Css中的cursor属性不仅仅需…

    2022年5月31日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号