Trie字典树



什么是 T r i e Trie Trie

一种树结构,用来存储字符串,能够查询某字符串是否存在

Trie

  • 由一个统一的根节点 r o o t root root 发散开,存储字符
    • 如果下一个字符之前有用过,就顺着之前的路线往后走
    • 如果下一个字符与之前的某串不重合,就另开一个路线继续走下去
  • 最后如果串存完了在末尾打个标记
    • 比如:之前存过字符串 ′ a b c d e f ′ 'abcdef' abcdef,我们再存 ′ a b c ′ 'abc' abc 就会发现后者是前者的子串,如果不打标记就发现不了这个串

一般条件

一般题目中都会说明是全大写字母或者全小写字母,所以说数组开的范围不会太大,当然也有大范围。(我在写啥???《-_-》)


AcWing 835. Trie字符串统计

板子题:https://www.acwing.com/activity/content/problem/content/883/
题目

CODE

#include <iostream>

using namespace std;

// 定义常量N为100010,这是我们预设的最大节点数量
const int N = 100010;

// son数组用于存储每个节点的子节点,每个节点有26个子节点,对应26个英文字母
// cnt数组用于存储每个节点结束的单词数量
// idx用于节点编号,每当我们创建一个新节点时,idx会加1
// str用于存储输入的字符串
int son[N][26], cnt[N], idx;
char str[N];

// 插入函数,用于将一个字符串插入到字典树中
void insert(char *str)
{
    // p是当前节点的编号,一开始我们在根节点,所以p=0
    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];		// 不能标记为idx,因为可能前面部分串有过记录,用idx就不对了
    }
    // 遍历完字符串后,我们在一个节点结束,所以该节点的单词数量加1
    cnt[p] ++ ;				// 这个也是同理,不能用idx
}

// 查询函数,用于查询一个字符串在字典树中出现的次数
int query(char *str)
{
    // p是当前节点的编号,一开始我们在根节点,所以p=0
    int p = 0;
    // 遍历输入字符串的每个字符
    for (int i = 0; str[i]; i ++ )
    {
        // 计算当前字符对应的编号
        int u = str[i] - 'a';
        // 如果当前节点没有对应的子节点,说明字符串不存在,返回0
        if (!son[p][u]) return 0;
        // 转移到子节点
        p = son[p][u];
    }
    // 返回当前节点的单词数量,即字符串在字典树中出现的次数
    return cnt[p];
}

// 主函数
int main()
{
    // n是操作数量
    int n;
    scanf("%d", &n);
    // 处理每个操作
    while (n -- )
    {
        // op是操作类型,str是操作的字符串
        char op[2];
        scanf("%s%s", op, str);
        // 如果操作类型是"I",则插入字符串
        if (*op == 'I') insert(str);
        // 否则,查询字符串并打印出现次数
        else printf("%d\n", query(str));
    }

    return 0;
}

解释一下 i n s e r t ( ) insert() insert() 函数

  • 首先读入了待插入的字符串str
  • 找到根节点 r o o t root root —> p = 0,也就是在son[0]位置是我们的根节点位置,由这个位置往后寻找
    • 先读入下一个字符,然后在后面 26 26 26 个字符空间中看这个字符是否被标记过
      • 如果被标记过则说明之前的某一字符串的这部分跟插入的串重合,拿着标记号去跟着之前的串走,也就是代码:
      p = son[p][u];
      
      • 如果未标记则说明之前没有串跟它重合,则需要自己开一条线往后走,同时给这个字符赋予新的编号++idx,代表我走过这条路,索引号是idx,也就是代码:
      if (!son[p][u]) son[p][u] = ++ idx;
      
  • 最后串读完了,打个标记,就是字符串最后的字符拿到的编号为索引的数量数组cnt[p]++
  • 对于 q u e r y ( ) query() query() 函数也是一样的思路

i d x idx idx 的意义

idx

1
2

素材来源:https://www.acwing.com/solution/content/5673/ の评论区
还是评论区大神多啊,orz %%%

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内如何访问github

1 购买一台美国硅谷的服务器 https://account.aliyun.com/login/login.htm?oauth_callbackhttps%3A%2F%2Fecs-buy.aliyun.com%2Fecs%3Fspm%3D5176.8789780.J_4267641240.2.721e45b559Ww1z%26accounttraceid%3Def6b6cc734bc49f896017a234071bfd9bctf 记得配置公网的ip&#xf…

MySQL进阶知识:SQL性能优化

目录 SQL性能分析 SQL执行频率 慢查询日志 profile详情 explain执行计划 索引的使用 最左前缀法则 范围查询 索引列运算 字符串加引号 模糊查询 or连接的条件 数据分布影响 SQL提示 覆盖索引 前缀索引 索引设计原则 SQL优化 insert优化 主键优化 页分裂 …

Agent举例与应用

什么是Agent OpenAI 应用研究主管 Lilian Weng 在一篇长文中提出了 Agent LLM&#xff08;大型语言模型&#xff09;记忆规划技能工具使用这一概念&#xff0c;并详细解释了Agent的每个模块的功能。她对Agent未来的应用前景充满信心&#xff0c;但也表明到挑战无处不在。 现…

yolov5利用yaml文件生成模型

一、yolov5的yaml文件构成 yaml文件如下图 不论是backbone还是head&#xff0c;每一行都由一个列表组成&#xff0c;列表里面有四个元素&#xff0c;另外&#xff0c;还有两个参数depth和width。在搭建模型的时候&#xff0c;会利用每一行的信息生成一个模块&#xff0c;并按照…

QT QGraphicsItem 图元覆盖导致鼠标点击事件不能传递到被覆盖图元

一、概述 在日常开发中&#xff0c;遇到这样一个问题&#xff0c;线图元和引脚图元重叠&#xff0c;导致点击引脚图元&#xff0c;没有进入引脚图元的鼠标点击事件中。 二、产生原因 如果您的 QGraphicsItem 上有一个图元覆盖了它&#xff0c;可能会导致鼠标事件无法正常触发…

跟国外客户沟通用词不同,效果可能也不同

每次和客户商量好所需要的商品的细节后&#xff0c;到了开支付链接的阶段&#xff0c;我都会习惯的说&#xff1a;shall we open the payment link for you now? 其实这句话是站在我们销售的立场上来说的&#xff0c;或者说是直接从汉语翻译成英语的句式。 但是最近我却突然想…

内存占用高排查

一、定位内存占用高的进程 top指令是最常见的检测系统运行状态的指令&#xff0c;但是因为展示界面和实时刷新的限制&#xff0c;则通过top指令不一定能够发现占用的内存很高的进程。因此&#xff0c;我们使用ps aux指令检索当前系统下的所有运行的进程。 • 下述指令查看系统…

样品实验Celloxide2021P环脂肪族环氧树脂TDS说明书

样品实验Celloxide2021P环脂肪族环氧树脂TDS说明书 200克 500克 1KG/瓶

c#把bitmap格式转换为其他格式图片

增加引用命名空间 using System.Drawing.Imaging; 打开对话框的方式读入bmp格式图片&#xff0c;转换为其他格式。 也可以直接传入图片名称。 OpenFileDialog ofd new OpenFileDialog();ofd.Title "打开对话框";ofd.InitialDirectory "D:/";ofd.Filt…

强化学习-DQN

网上看来很多&#xff0c;但是还是觉得这篇文章将得最好&#xff1a; 可视化强化学习解释 - Deep Q Networks&#xff0c;循序渐进 |Ketan Doshi 博客 (ketanhdoshi.github.io)

Qt串口助手

QT5 串口助手 ​ 由于C课程作业的需要&#xff0c;用QT5写了个简陋的串口助手。只作为一个简单的案例以供参考&#xff0c;默认读者具有C基础和了解简单的Qt操作。 功能展示 【用QT写了个简单的串口助手】 准备工作 Qt自带有<QSerialPort> 库, 可以方便地配置和调用…

招募 品牌设计师:最具创造力、破坏性、颠覆性

PIX Moving 寻 品牌设计师 重点要求「有破坏性」 设计需求 LOGO VI 市场方向 面向欧洲 案例参考 设计要求 &#xff5c; 这辆充满了创意和激情的 NEV 被命名为 Solo&#xff0c;它是 Z 世代用户的个人移动空间&#xff0c;强调个体的力量与价值。产品特征为去中心化创造、…

Zookeeper从零入门笔记

一、入门 1. 概述 2. 特点 3. 数据结构 4. 应用场景 统一命名服务&#xff1a;nginx也可以实现 统一配置管理&#xff1a; 统一集群管理&#xff1a; 服务器动态上下线&#xff1a; 软负载均衡&#xff1a; 二、本地 1.安装 2. 参数解读 三、集群操作 3.1.1 集群安装…

分享:大数据方向学生学徒参与条件

学生学徒制的实施旨在解决当前新技术企业招聘技能人才难和青年就业难的结构性矛盾&#xff0c;通过生态链链主企业携手院校共同解决毕业年度学生就业问题&#xff0c;按照学生个人意愿&#xff0c;建立以就业导向的学生学徒制关系&#xff0c;签订学徒培养协议确定学生就业岗位…

采购业务中的组织概述

目录 一、采购和库存管理中组织单位的概览二、企业的组织结构三、采购中组织结构3.1采购组织3.2采购组 一、采购和库存管理中组织单位的概览 1、 客户端&#xff1a;在SAP ERP系统中&#xff0c;客户端通过三位数字定义&#xff0c;并代表这独立的数据记录和独立的业务流程。客…

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)

目录 9.1.4 设计立方体类 ​编辑 9.1.5 成员函数在类的外部实现 9.1.6 类在其他源文件的实现步骤&#xff08;实现类在不同文件的实现&#xff0c;后续引出构造函数&#xff09; 注意:类定义在同文件testclass.h中&#xff0c;而testclass.cpp是用来实现&#xff08;声明&…

JAVA基础进阶(三)

一、权限修饰符的访问权限 需要特别注意的是: 被private修饰的成员变量以及成员方法只能在本类中进行调用&#xff0c;所以在其他类中创建本类对象,无法直接访问私有成员变量和成员方法,只能通过set、get方法间接访问。被public修饰的成员变量以及成员方法可以在任意地方被调用…

CHEM 14 not know

Goals of this lab: • Create and use a calibration curve for the absorbance/concentration relationship for crystal violet • Evaluate absorbance versus time measurements to determine the order of a reaction • Analyze graphs of data to determine best linea…

微信小程序自定义tabber凸起

一、实现效果 二、下载地址 下载地址 源码有错自己修改一下就行

Jmeter之压力测试总结!

一、基本概念 1.线程组N&#xff1a;代表一定数量的并发用户&#xff0c;所谓并发就是指同一时刻访问发送请求的用户。线程组就是模拟并发用户访问。 2.Ramp-Up Period(in seconds)&#xff1a;建立所有线程的周期&#xff0c;就是告诉jmeter要在多久没启动所有线程&#xff…