数据结构 - 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.mzph.cn/news/721780.shtml

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

相关文章

运维随录实战(3)

Gitlab架构设计 方案一:SaaS方案 依赖资源: PostgreSQL: 阿里云SAAS服务高可用版2c4g/100GRedis:阿里云SAAS服务高可用版2G代码存储:阿里云NAS盘500GGitLab服务架构: 2*4c8g1*SLB(复用官网SLB)n*GitlabRunner备份方案 PostgreSQL通过阿里云备份功能每天备份一次 代码…

OPC DA协议网关

在工业自动化领域&#xff0c;数据的采集与传输是至关重要的环节。而OPC DA&#xff08;OLE for Process Control Data Access&#xff09;协议作为这一领域内的标准通信协议&#xff0c;为不同设备和软件之间的数据交换提供了统一的接口。今天&#xff0c;我们就来深入了解一下…

Cookie和session 及Web相关工具

一 Cookie &#xff08;一&#xff09;介绍 Cookie 又称为"小甜饼”。类型为"小型文本文件”&#xff0c;指某些网站为了辨别用户身份而储存在用户本地终端&#xff08;Client Side&#xff09;上的数据&#xff08;通常经过加密&#xff09;。由网景公司的前雇员…

Jmeter性能测试 -3数据驱动实战

什么是数据驱动&#xff1f; 从数据文件中读取测试数据&#xff0c;驱动测试过程的一种测试方法。数据驱动可以理解为更高级的参数化。 特点&#xff1a;测试数据与测试代码分离&#xff1b;数据控制过程 好处&#xff1a;降低开发和维护成本&#xff0c;减少代码量&#xf…

springboot之异步任务、邮件任务、定时任务

springboot之异步任务 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

.NET 视图组件(ViewComponent)教程大全

.NET 8 视图组件教程 1. 引言 什么是视图组件为什么使用视图组件 2. 创建视图组件 视图组件的命名规则如何定义 Invoke 或 InvokeAsync 方法如何从 ViewComponent 基类派生如何使用 ViewComponent 属性 3. 使用视图组件 如何在视图中调用视图组件如何传递参数到视图组件 …

MySQL 添加主键可以节省磁盘空间吗?

MySQL 表定义主键不是必须的&#xff0c;并且直到今天&#xff08;MySQL 版本 8.3.0&#xff09;都是这样。不过&#xff0c;在 MGR 和 PXC 架构中不允许使用没有主键的表。如果数据表没有主键&#xff0c;会有许多众所周知的负面性能影响&#xff0c;其中最痛苦的是复制速度很…

ROS 2基础概念#4:消息(Message)| ROS 2学习笔记

ROS 2消息简介 ROS程序使用三种不同的接口来进行沟通&#xff1a;消息&#xff08;message&#xff09;&#xff0c;服务&#xff08;service&#xff09;和动作&#xff08;action&#xff09;。ROS 2使用一种简化的描述语言&#xff1a;IDL&#xff08;interface definition…

Vue.js 深度解析:模板编译原理与过程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

代码随想录算法训练营day36|435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 代码随想录 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(keylambda x:x[0])result 0for i in range(1,len(intervals)):if intervals[i][0] < intervals[i-1][1]:result 1intervals[i][1] m…

【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

【python】堆排序

堆的概念 堆&#xff1a;一种特殊完全二叉树&#xff0c;也就是二叉树必须全部是满的&#xff0c;但是最后一排可以从右向左缺失。 大根堆&#xff1a;每个节点都比他的子节点大 小根堆&#xff1a;每个节点都比子节点小 堆在代码中的形式 堆在代码中实际上就是列表&#…

[Angular 基础] - routing 路由(下)

[Angular 基础] - routing 路由(下) 之前部分 Angular 笔记&#xff1a; [Angular 基础] - 自定义指令&#xff0c;深入学习 directive [Angular 基础] - service 服务 [Angular 基础] - routing 路由(上) 使用 route 书接上回&#xff0c;继续折腾 routing 按照最初的 wi…

【JavaScript】forEach() 会不会改变原数组?

forEach() forEach()方法需要一个函数作为参数。这种函数&#xff0c;是由我们创建但是不由我们调用的&#xff0c;我们称为回调函数。 数组中有几个元素&#xff0c;该回调函数就会执行几次。 回调函数中传递三个参数&#xff1a; 参数1&#xff1a;当前正在遍历的元素 参…

洛谷P1039题解

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…

Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号 介绍和使用 在Linux的命令行中&#xff0c;重定向符号用于将命令的输入或输出重定向到文件或设备。 常见的重定向符号&#xff1a; 1.“>“符号&#xff1a;将命令的标准输出重定向到指定文件中&#xff0c;并覆盖原有的内容。 2.”>>“符号&a…

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题

1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…

YOLOv8改进 在更换的PoolFormer主干网络中增加注意力机制

一、PoolFormer的网络结构 PoolFormer采用自注意力机制和池化操作相结合的方式&#xff0c;同时考虑了局部和全局的特征关系。 具体的代码如&#xff08;YOLOv8改进 更换多层池化操作主干网络PoolFormer_yolov8池化-CSDN博客&#xff09;所示。 二、Global Attention Mechan…

python一张大图找小图的个数

python一张大图找小图的个数 一、背景 有时候我们在浏览网站时&#xff0c;发现都是前端搞出来的一张张图&#xff0c;我们只能用盯住屏幕的小眼睛看着&#xff0c;很累的统计&#xff0c;这个是我在项目中发现没办法统计&#xff0c;网上的教程很多&#xff0c;都不成功&…