数据结构 - Trie树(字符串统计、最大异或对)

文章目录

  • 前言
  • Part 1:Trie字符串统计
    • 1.题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例
        • 输出样例
    • 2.算法
  • Part 2:最大异或对
    • 1.题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例
        • 输出样例
    • 2.算法

前言

本篇博客将介绍Trie树的常见应用,包括:Trie字符串统计、最大异或对。首先,我们要知道Trie树是什么?

Trie树:是一种多叉树的结构,每个节点保存一个字符,一条路径表示一个字符串。例子:下图表示了字符串: him 、 her 、 cat 、 no 、 nova 构成的 Trie 树在这里插入图片描述

Part 1:Trie字符串统计

1.题目描述

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N 个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N 行,每行包含一个操作指令,指令为 I xQ x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤2∗104

输入样例
5
I abc
Q abc
Q ab
I ab
Q ab
输出样例
1
0
1

2.算法

  • 用数组来模拟Trie树
    在这里插入图片描述
#include <iostream>using namespace std;const int N = 100010;
//son[][]存储子节点的位置,分支最多26条;
//cnt[]存储以某节点结尾的字符串个数(同时也起标记作用)
//idx表示当前要插入的节点是第几个,每创建一个节点值+1
int son[N][26], cnt[N], idx;
char str[N];//插入字符串
void insert(char *str)
{int p = 0;  //类似指针,指向当前节点for(int i = 0; str[i]; i++){int u = str[i] - 'a'; //将字母转化为数字if(!son[p][u]) son[p][u] = ++idx;   //该节点不存在,创建节点p = son[p][u];  //使“p指针”指向下一个节点}cnt[p]++;  //结束时的标记,也是记录以此节点结束的字符串个数
}//查找字符串次数
int query(char *str)
{int p = 0;for(int i = 0; str[i]; i++){int u = str[i] - 'a';if(!son[p][u]) return 0;  //该节点不存在,即该字符串不存在p = son[p][u]; }return cnt[p];  //返回字符串出现的次数
}int main()
{int m;cin >> m;while(m--){char op[2];scanf("%s%s", op, str);if(*op == 'I') insert(str);else printf("%d\n", query(str));}return 0;
}

Part 2:最大异或对

1.题目描述

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

输入格式

第一行输入一个整数 N。

第二行输入 N 个整数 A1~AN。

输出格式

输出一个整数表示答案。

数据范围

1≤N≤105,
0≤Ai<231

输入样例
3
1 2 3
输出样例
3

2.算法

  • 字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字
  • 将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
//保存 Trie 树
int son[N * 31][2];  
int n, idx;void insert(int x)
{int p = 0;//初始化指向根节点//从最高位开始,依次取出每一位for (int i = 31; i >= 0; i--){   // 取出当前位int u = x >> i & 1;//如果树中不能走到当前数字//为当前数字创建新的节点,保存该数字if (!son[p][u])// 新节点编号为 idx + 1son[p][u] = ++idx; p = son[p][u];}
}int query(int x)
{//指向根节点int p = 0;// 保存与 x 异或结果最大的那个数int ret = 0;//从最高位开始,依次取出 x 的每一位for (int i = 31; i >= 0; i--){// 取出 x 的当前位int u = x >> i & 1;//如果树中能走到 !u,就走到!uif (son[p][!u]){//走到!up = son[p][!u];//更新 x 异或的对象ret = ret * 2 + !u;}  //没有!u,就只能走到u了else{p = son[p][u];//更新 x 异或的对象ret = ret * 2 + u; }}//计算异或结果ret = ret ^ x;return ret;
}int main()
{cin >> n;int maxXorNum = 0; int x;for (int i = 0; i < n; i++){cin >> x;insert(x);maxXorNum = max(maxXorNum, query(x));}cout << maxXorNum << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java毕业设计-基于springboot开发的摄影跟拍预定管理系统-毕业论文+答辩PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、摄影师功能模块4、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开…

运用qsort函数进行快排并使用C语言模拟qsort

qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的&#xff0c;下面我们打开官网来查看qsort是如何使用的。 这里有四个参数&#xff0c;首先base 是至待排序的数组的首元素的地址&#xff0c;num 是值这个数组的元素个数&#xff0c;size 是指每个元素的大小&am…

JVM(6)

JMM JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另…

Spring 事务传播机制

事务传播机制&#xff1a;多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如&#xff1a;有两个⽅法A&#xff0c;B都被 Transactional 修饰,&#xff0c;A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时&#xff0c; B⽅法本⾝也有事务&#xf…

【CSS】(标准流部分)易忘知识点汇总

一、元素 块元素 常见的块元素&#xff1a; <h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>行内元素 常见的行内元素&#xff1a; <a>、<strong>、<b>、<em>、<i>、<del>、<s>、<ins&…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;3&#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍&#xff1a; DMI (趋向指标&#xff09; 用法 1.PDI线从下向上突破MDI线&#xff0c;显示有新多头进场&#xff0c;为…

喀秋莎软件如何编辑视频 Camtasia2023软件下载 电脑录屏剪辑软件推荐 Camtasia安装教程 微课视频制作方法 课件制作投屏软件

现在市面上的课件录制软件很多&#xff0c;许多人都听说过Camtasia&#xff0c;它是TechSmith旗下的一套专业屏幕录制软件&#xff0c;同时包含Camtasia录像器、Camtasia编辑器、Camtasia菜单制作器、Camtasia剧场、Camtasia播放器和Screencast的内置功能。 今天我们就来介绍如…

精准唇语同步:Wav2Lip 引领视频技术前沿 | 开源日报 No.188

Rudrabha/Wav2Lip Stars: 8.4k License: NOASSERTION Wav2Lip 是一个准确地在野外进行视频唇语同步的项目。 该项目的主要功能、关键特性和核心优势包括&#xff1a; 可以高精度地将视频与任何目标语音进行唇语同步适用于任何身份、声音和语言&#xff0c;也适用于 CGI 面孔和…

B树系列(详解)

目录 一、B-树 二、B树 三、B*树 四、时间复杂度 五、Mysql与B树系列 一、B-树 首先再说B树的性质以及其他的之前&#xff0c;先要说一声&#xff0c;好多人都把这个树叫B减树&#xff0c;其实不是&#xff0c;他就叫B树&#xff0c;至于原因我觉的没必要再这个名字上纠结…

基于Springboot的同城上门喂遛宠物系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的同城上门喂遛宠物系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

React Developer Tools带你掌握9个React组件调试技巧,十分钟学会

React Developer Tools 是 React 官方推出的开发者插件&#xff0c;可以毫不夸张的说&#xff0c;它在我们日常组件开发中&#xff0c;对于组件属性以及文件定位&#xff0c;props 排查等等场景都扮演者至关重要的角色&#xff1b;毋庸置疑&#xff0c;熟练使用React Developer…

Window下编写的sh文件在Linux/Docker中无法使用

Window下编写的sh文件在Linux/Docker中无法使用 一、sh文件目的1.1 初始状态1.2 目的 二、过程与异常2.1 首先获取标准ubuntu20.04 - 正常2.2 启动ubuntu20.04容器 - 正常2.3 执行windows下写的preInstall文件 - 报错 三、检查和处理3.1 评估异常3.2 处理异常3.3 调整后运行测试…