算法学习系列(十三):Trie树

目录

  • 引言
  • 一、Trie概念
  • 二、Trie树模板
  • 三、例题

引言

这个Trie还是比较有用的,主要的功能就是高效的存储和查找字符串的数据结构。

一、Trie概念

假设这个Trie只存储小写字母的话:
这个大概就是这么个概念,就是头结点是0号,然后每个结点都可以有26个儿子,然后每个儿子又有它们的儿子

  • 插入操作:先看0号结点的儿子有没有插入字符串的第一个字符,如果有那就进入下一个结点,如果没有那就创造出来,然后进入下一个结点,再判断第二个字符
  • 查询操作:先看第一个字符,0号结点有没有这个儿子,然后看这个儿子的儿子有没有第二个字符,就这样查询下去,直至最后一个字符,中间要是不存在一个,那就没有
    在这里插入图片描述

二、Trie树模板

这个注释我觉得还是写的比较详细清楚的,看看注释一般就可以看懂

//son[i][j]代表第i号结点的第j号儿子存在与否,不存在为0,存在则为结点的编号
int son[N][26], cnt[N], idx;  //cnt[i]代表以结点编号为i的字符串的个数,idx代表当前可用的结点的编号
char str[N];

void insert(char str[])
{
    int p = 0;  //从0号结点开始
    for(int i = 0; str[i]; i++)  //开始遍历str
    {
        int u = str[i] - 'a';  //因为插入的只有小写字母,代表0-25的映射
        if(!son[p][u]) son[p][u] = idx++;  //没有就创建一个,给它赋个编号,代表有这个编号为idx的儿子
        p = son[p][u];  //进入到儿子结点
    }
    
    cnt[p]++;  //为以编号为p结尾的cnt++
}

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;  //如果任意一个结点不存在,就说明存在的次数为0
        p = son[p][u];
    }
    
    return cnt[p];  //返回编号为p的cnt
}

三、例题

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

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

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

输入格式
第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。

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

数据范围
1≤N≤2∗104

输入样例:
5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:
1
0
1
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 1e5+10;  //代表总共的结点数,每一个结点都有一个编号

//son[i][j]代表第i号结点的第j号儿子存在与否,不存在为0,存在则为结点的编号
int son[N][26], cnt[N], idx;  //cnt[i]代表以结点编号为i的字符串的个数,idx代表当前可用的结点的编号
char str[N];

void insert(char str[])
{
    int p = 0;  //从0号结点开始
    for(int i = 0; str[i]; i++)  //开始遍历str
    {
        int u = str[i] - 'a';  //因为插入的只有小写字母,代表0-25的映射
        if(!son[p][u]) son[p][u] = ++idx;  //没有就创建一个,给它赋个编号,代表有这个编号为idx的儿子
        p = son[p][u];  //进入到儿子结点
    }
    
    cnt[p]++;  //为以编号为p结尾的cnt++
}

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;  //如果任意一个结点不存在,就说明存在的次数为0
        p = son[p][u];
    }
    
    return cnt[p];  //返回编号为p的cnt
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while(n--)
    {
        char op[2];
        scanf("%s%s", op, str);  //%s以空格或回车为结束标志,自动在后添'\0'
        
        if(!strcmp(op, "I"))
        {
            insert(str);
        }
        else
        {
            printf("%d\n", query(str));
        }
    }
    
    return 0;
}

这也是全部AC了的
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用腾讯云轻量应用服务器基于SRS搭建个人直播间

使用腾讯云轻量应用服务器基于SRS音视频服务器应用模板镜像即可一键搭建个人直播间&#xff0c;SRS Stack让你一键拥有自己的视频云解决方案&#xff0c;可以在云上或私有化部署&#xff0c;支持丰富的音视频协议&#xff0c;提供鉴权、私人直播间、多平台转播、录制、虚拟直播…

js中变量的使用

文章目录 一、变量二、声明三、赋值四、更新变量五、声明多个变量(不推荐)六、变量的本质七、关键字八、变量名命名规则 一、变量 理解变量是计算机存储数据的“容器”&#xff0c;掌握变量的声明方式 白话&#xff1a;变量就是一个装东西的盒子。通俗&#xff1a;变量是计算机…

【MySQL学习笔记007】约束

1、概述 &#xff08;1&#xff09;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 &#xff08;2&#xff09;目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 &#xff08;3&#xff09;分类 约束 描述 关键字 …

ZStack Cube超融合一体机助力电子支付企业升级改造

电子支付服务企业实壹信息通过ZStack Cube超融合一体机为业务生产环境构建新一代云基础设施&#xff0c;结合V2V迁移模块实现ZStack社区版云平台应用迁移到全新的云基础设施ZStack Cube 超融合一体机上&#xff0c;同时共享分布式存储和外接FC-SAN存储。此外&#xff0c;运维人…

Android 8.1 设置USB传输文件模式(MTP)

项目需求&#xff0c;需要在电脑端adb发送通知手机端接收指令&#xff0c;将USB的仅充电模式更改成传输文件&#xff08;MTP&#xff09;模式&#xff0c;便捷用户在我的电脑里操作内存文件&#xff0c;下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…

Elasticsearch:在不停机的情况下优化 Elasticsearch Reindex

实现零停机、高效率和成功迁移更新的指南。更多阅读&#xff1a;Elasticsearch&#xff1a;如何轻松安全地对实时 Elasticsearch 索引 reindex 你的数据。 在使用 Elasticsearch 的时候&#xff0c;总会有需要修改索引映射的时候&#xff0c;遇到这种情况&#xff0c;我们只能做…

go语言,ent库与gorm库,插入一条null值的time数据

情景介绍 使用go语言&#xff0c;我需要保存xxxTime的字段至数据库中&#xff0c;这个字段可能为空&#xff0c;也可能是一段时间。我采取的是统一先赋值为空&#xff0c;若有需要&#xff0c;则再进行插入&#xff08;需要根据另一个字段判断是否插入&#xff09; 在我的数据…

PTS 3.0:可观测加持的下一代性能测试服务

作者&#xff1a;肖长军&#xff08;穹谷&#xff09; 大家好&#xff0c;我是来自阿里云云原生应用平台的肖长军&#xff0c;花名穹谷&#xff0c;我此次分享的主题是《可观测加持的下一代性能测试服务》。提到性能测试大家并不陌生&#xff0c;性能测试已成为评估系统能力、…

使用rsync构建镜像网站

实验环境 某公司在深圳、北京两地各放置了一台网站服务器&#xff0c;分别应对南北大区内不断增长的客户访问需求&#xff0c;两台服务器的网站文档必须保持一致&#xff0c;如图12.3所示&#xff0c;同步链路已通过VPN专用线路实现。 需求描述 > 服务器 A&#xff08;北京…

SpringBoot多线程与任务调度总结

一、前言 多线程与任务调度是java开发中必须掌握的技能&#xff0c;在springBoot的开发中&#xff0c;多线程和任务调度变得越来越简单。实现方式可以通过实现ApplicationRunner接口&#xff0c;重新run的方法实现多线程。任务调度则可以使用Scheduled注解 二、使用示例 Slf…

linux如何清理磁盘,使得数据难以恢复

sda 是硬盘&#xff0c;sda1 和 sda2 是硬盘的两个分区。centos-root 是一个逻辑卷&#xff0c;挂载在根目录 /。 /dev/sda 是硬盘&#xff0c;/dev/sda1 和 /dev/sda2 是硬盘的两个分区。 [rootnode2 ~]# dd if/dev/urandom of/dev/sda bs4M这个命令将从 /dev/urandom 读取随…

【软件工程大题】数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…

<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录 TCP的通信机制的核心特性 三、连接管理 1&#xff09;什么是连接管理&#xff1f; 2&#xff09;“三次握手”建立连接 1> 什么是“三次握手”&#xff1f; 2> “三次握手”的核心作用是什么&#xff1f; 3&#xff09;“四次挥手”断开连接 1> 什么是“…

vue动态路由,三级及以上路由,地址跳转,但是页面不显示

vue动态路由的时候,一级,二级路由都正常展示,但是三级,四级,五级等就只看到地址跳转了,但是页面并没有跳转,原因是共用了一个<router-view></router-view> import Layout from /layout import Vue from vue import Router from vue-router import db from /utils/…

工具系列:TensorFlow决策森林_(8)组合决策森林和神经网络模型

文章目录 介绍安装 TensorFlow Decision Forests导入库数据集模型结构模型训练评估决策森林下一步是什么&#xff1f; 介绍 欢迎来到TensorFlow Decision Forests&#xff08;TF-DF&#xff09;的模型组合教程。本教程将向您展示如何使用通用的预处理层和Keras函数式API将多个…

linux 网络工具(一)

linux 网络工具 1. nmcli命令1.1 介绍1.2 networking 网络控制1.3 connection 连接管理1.4 device 设备管理1.5 nmcli 返回状态码 2. ifcfg命令家族2.1 ifconfig2.2 route2.3 netstat 3. 静态路由CentosUbuntu - netplanUbuntu - network-manager 1. nmcli命令 1.1 介绍 RHEL…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

安卓全球定位系统RTK测量仪 手持GPS北斗定位仪可用于国土电力

RTK&#xff0c;英文全名叫做Real-time kinematic&#xff0c;也就是实时动态。这是一个简称&#xff0c;全称是RTK&#xff08;Real-time kinematic&#xff0c;实时动态&#xff09;载波相位差分技术。 RTK定位是一种高精度的全球卫星导航技术&#xff0c;是实时运用技术&…

springcloud之通过openfeign优化服务调用方式

写在前面 源码 。 在前面的文章中我们实际上已经完成了优惠券模块微服务化的改造&#xff0c;但是其中还是有比较多可以优化和增强的地方&#xff0c;本文就先来对服务间的通信方式进行优化&#xff0c;具体就是使用openfeign来替换调原来的webclient。下面我们就开始吧&#…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…