数据结构之Trie树

news2024/10/6 12:21:32

Trie树:

Tire树可以较为高效的存储和查找字符串集合。

存储方式:
首先Trie有一个根节点,我们按从前往后的顺序将字符串的每个位置上的字符存储到树的每一层中,这样我们存储多个字符串时就可以消除一部分冗余,在查询字符串的时候时间复杂度是线性的,只与字符串的长度关联(层数)。

 插入和查询字符串的代码:

//初始化
//所有字符串长度之和小于1e5
//son表示树最多N个节点,每个节点有26个儿子(26个小写字母)
//cnt表示以每个节点结尾的字符串有多少个
//idx代表当前用到哪个节点了,根节点为0号节点也是空节点
const int N = 1e5 + 10;
int son[N][26], cnt[N], idx = 0;

//插入
void insert(string str) {
    int p = 0;//从根节点开始
    for (int i = 0; str[i]; i++) {//遍历字符串,字符串以0结尾
        if (!son[p][str[i] - 'a']) {//如果该节点不存在str[i]这个节点
            son[p][str[i] - 'a'] = ++idx;
            p = son[p][str[i] - 'a'];
        }
        else p = son[p][str[i] - 'a'];
    }

    cnt[p]++;
    return;
}

//查询
int query(string str) {
    int p = 0;//从根节点开始
    for (int i = 0; str[i]; i++) {//遍历字符串,字符串以0结尾
        if (!son[p][str[i] - 'a']) {//如果该节点不存在str[i]这个节点
            return 0;
        }
        else p = son[p][str[i] - 'a'];
    }
    return cnt[p];
}

一些变量的说明:

son[N][26]代表了一共N个节点,而不是N层,26代表每个节点有26个儿子。遍历到下一层体现在数组中可能是跳跃了n个位置。cnt[N]代表N个节点,以每个节点为结束的字符串数量。根节点标号为0,也就是指向根节点的指针为0。

例题:最大异或对

在给定的 N个整数 A1,A2……AN中选出两个进行 xor(异或)运算,得到的结果最大是多少?

数据范围:1≤N≤1e5,0≤An≤2e31

输入格式:第一行一个数N,第二行N个数An。

输出格式:输出一个数表示结果。

思路:

异或运算:两个数的异或运算,先把两个数看最二进制形式,如果二进制位相同该二进制位就是0,不相同该二进制位就是1。

5^8:bin(5)=0101,bin(8)=1000,bin(5^8)=1101=dec(13)。

首先,如果使用暴力做法的话,双重循环,枚举每一对数,时间复杂度为O(n^2),对于1e5的数据会超时。Trie树做法:我们将每个数的每个二进制位放在一起构造出一颗Trie树(高位在前),然后我们只需要遍历每一个数,并将每一个数在树中做一次查找(尽可能的查找反方向的),这样就可以得出每个数的最大异或是多少。由于树的高度是二进制位的,二进制位的个数,所以时间复杂度为O(n*30),为线性的。

代码如下:

#include<iostream>
#include<cmath>
using namespace std;
const int N=1e5+10;
int son[N*31][2],idx=1;//每个数最多31个节点,一共1e5个数
int q[N];
int n;

void insert(int x){
    int p=0;
    for(int i=30;i>=0;i--){//从高位开始建立trie
        if(!son[p][(x>>i&1)]){
            son[p][x>>i&1]=idx++;
            p=son[p][x>>i&1];
        }
        else p=son[p][x>>i&1];
    }
    return;
}

int query(int x){
    int p=0;
    long long res=0;
    for(int i=30;i>=0;i--){
        if(son[p][!(x>>i&1)]){res=res*2+1;p=son[p][!(x>>i&1)];}
        else {res=res*2;p=son[p][x>>i&1];}
    }
    return res;
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++){//建立trie
        cin>>q[i];
        insert(q[i]);
    }
    
    int res=-0x3f3f3f3f;
    for(int i=0;i<n;i++)
        res=max(res,query(q[i]));
    
    cout<<res;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

期货开户后需要银期转账绑定

一、期货公司正规性 如何判断期货公司是否正规&#xff1f; 1、 中国证监会官网有公布所有正规期货公司&#xff08;一共150家&#xff09;名录的&#xff0c;我们可以直接参考证监会发布链接&#xff1a;期货公司名录 2、如果你懒得从名录中一个个找&#xff0c;也可以直接…

一款不错的SpringCloud 脚手架项目

文章目录 I 一款不错的SpringCloud 脚手架项目1.1 项目概述1.2 本地启动II. Swagger RESTful 风格的 Web 服务框架2.1 组成部分2.2 springfoxIII 相关辅助脚本3.1 pod 辅助脚本3.2 git 辅助脚本I 一款不错的SpringCloud 脚手架项目 1.1 项目概述 springboot+springcloud注册中心…

基于SpringBoot的电子招标投标管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;HTML、Vue 数据库&#xff1a;MySQL5.7 数据库管理工具&#xff1a;Navicat 12 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否…

Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/127967304 本文出自【赵彦军的博客】 文章目录效果BottomSheetBottomSheetDialogBottomSheetDialogFragment圆角效果去掉背景蒙版设置蒙版透明度点击 dialog 外部区域&#xff0c;dialog 不消失禁…

STC51单片机37——定时器流水灯

// 12MHz晶振 #include "reg52.h" #include "intrins.h" #define time (65536-50000) // 单次定时50ms unsigned char cn; unsigned char temp; unsigned char dir; void main(void) { cn20; //20*50ms1s temp0x80; dir0; TMOD 0x…

Vue简单示例——weex

weex的生命周期&#xff1a; 因为我们的Weex和Vue是绑定在一起的&#xff0c;所以我们讨论关于生命周期时&#xff0c;说的实际上是在Weex中可以使用的Vuex的生命周期&#xff0c;也就是Weex对于Vue生命周期的支持&#xff0c;好消息&#xff0c;Weex支持大部分的Vue中的生命周…

基于Vue+ElementUI+MySQL+Express的学生管理系统(3)

3.搭建学生考试信息的前端页面 1.在E:\vue\shiyan9目录下用cmd打开命令窗口。输入命令vue init webpack score-manage&#xff0c;创建一个基于webpack模板的项目。 图15 创建一个新的vue的脚手架的项目 2.执行cd score-manage&#xff0c;进入目录包下。下载依赖包。命令如下…

Pytorch 图像增强 实现翻转裁剪色调等 附代码(全)

目录前言1. 裁剪1.1 中心裁剪1.2 随机裁剪1.3 随机尺寸裁剪2. 翻转2.1 水平翻转2.2 垂直翻转2.3 随机旋转3. 色调3.1 灰度变换3.2 色彩抖动3.3 随机翻转颜色3.4 随机调整锐度3.5 高斯模糊4. 边缘填充5. 仿射变换前言 下文中有使用到plt&#xff0c;不懂的可看我这篇文章&#…

doker中的Jenkins容器配置github

1、在Jenkins插件 管理中下载github plugin和ssh和git插件 2、在Jenkins->系统管理->系统配置->github下配置凭据认证&#xff0c;添加凭证页面类型选择secret text 3、添加凭证页面secret栏输入githu token&#xff0c;其他任意输入 4、github token获取&#xf…

FANUC机器人零点复归的报警原因分析和零点标定相关步骤

FANUC机器人零点复归的报警原因分析和零点标定相关步骤 FANUC机器人零点复归时需要将机器人的机械信息与位置信息同步,来定义机器人的物理位置。 机器人通过闭环伺服系统来控制机器人各运动轴,当用户通过示教器点动机器人时,经过主板分析此命令后,带动电机旋转,电机上的SP…

软件测试入门概念

满足用户期望或正式规定文档&#xff08;合同、标准、规范&#xff09;所具有的条件和权能&#xff0c;包含用户需求和软件需求。 用户需求&#xff1a; 五花八门的用户需求&#xff0c;该需求比较简略。 软件需求&#xff1a; 又叫功能需求&#xff0c;该需求会详细描述开发…

SLAM本质剖析-Boost之Geometry函数大全(二)

4. 点云处理 4.1 add_point 将一个点添加到另一个点 4.2 add_value 将相同的值添加到点的每个坐标 4.3 assign_point 用另一个点指定一个点 4.4 assign_value 为点的每个坐标指定相同的值 4.5 cross_product 计算两个向量的叉积 4.7 divide_point 将一点除以另一点…

Python用27行代码绘制一幅满天星

前言 大家早好、午好、晚好吖 ❤ ~ 每一个孩子都像星空中的一颗星星&#xff0c;散发着自己所特有的光芒照亮着整个夜空。 今天就带大家用27行Python代码绘制一幅满天星吧。 全局设置 在绘制满天星的过程中要运用到turtle工具&#xff0c;它是Python的标准库&#xff0c;也可…

堆排序+TOPK问题

文章目录一.堆排序1.使用向上还是向下调整建堆好&#xff1f;(1)向上调整算法建堆的时间复杂度1. 完整过程(2)向下调整算法建堆的时间复杂度1.完整过程(3)总结2. 排升序(1) 建小堆(2) 建大堆3. 堆排序时间复杂度统计4.完整代码二 、 TOPK问题1. 概念2.两种方法第一种缺陷第二种…

【论文阅读】(2017)The late acceptance Hill-Climbing heuristic

文章目录一、摘要二、Late Acceptance Hill Climbing三、LAHC技术性能的研究3.1 Benchmark problems3.2 Experimental software3.3 Experiments四、LAHC性能评估4.1 评估方法4.2 LAHC不同变体的性能4.3 LAHC与其他技术的比较4.4 LAHC的规模独立性五、Conclusions and future wo…

Salesforce架构师常见问题(上)

Salesforce架构师需要花费大量时间来绘制、讨论、建立和设计稳健的端到端解决方案。架构师角色不仅仅是处理解决方案这么简单&#xff0c;还需要在企业级组织中与多个业务部门打交道。 因此&#xff0c;Salesforce架构师面试需要从以下3个方面准备&#xff1a; Part.1 分享工…

快速理解 JVM 内存模型 对象组成 对象内存分配

快速理解 JVM 内存模型 & 对象组成 & 对象内存分配 JVM 内存模型 JVM 内存模型分为首先在线程纬度可以分为两部分 一部分是 线程共享&#xff1a; 堆、元空间 堆 &#xff1a; 大多数 new 的对象都存在于堆内&#xff0c;也是 GC 主要回收的空间&#xff0c;占据 J…

涨薪跳槽利器,清华大咖总结的 Java 核心突击讲,一应俱全

前言 今天在这里分享一位读者粉丝的经历&#xff1a; 本人双非本科&#xff0c;没拿什么过奖&#xff0c;现在毕业也有三年时间了&#xff0c;大四感觉能力有点不足&#xff0c;进了一家小型的互联网公司实习&#xff1b;期间报名了个线上培训课程&#xff0c;一直在持续学习…

超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)

文章目录1.项目部署规划2.前置工作2.1修改后端配置文件ip2.2修改前端Vue项目运行端口2.3修改前端对应的服务器ip2.4后端项目打包2.4.1解决打包问题2.4.2项目打包&#xff0c;本地运行jar包测试2.5前端项目打包2.6开放端口2.7配置安全组规则3.Docker安装4.拉取镜像5.编写Dockerf…

挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机

时代在进步&#xff0c;而我们也顺势享受着进步过程中所产生的物件&#xff0c;就如骨传导和传统耳机&#xff0c;年轻人更多时候会偏向于骨传导耳机&#xff0c;毕竟骨传导的最大的特点就是佩戴舒适的同时&#xff0c;开放式耳道的设计能够更好的让中耳炎说拜拜。但近期市面上…