Trie存储和查找字符串

news2024/10/5 22:24:40

一、链接

835. Trie字符串统计

二、题目

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

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

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

输入格式

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

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

输出格式

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

每个结果占一行。

数据范围

1≤N≤2∗1041≤N≤2∗104

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

三、题意

利用Trie来存储和查询字符串,属于模板题

四、代码

#include<iostream>

using namespace std;

const int N=1e5+10;

char str[N];
int son[N][26],idx,cnt[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];
    }
    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 n;
    scanf("%d",&n);
    while(n--)
    {
        char op[2];
        scanf("%s%s",op,str);
        
        if(op[0]=='I')
        {
            insert(str);
        }
        else
        {
            printf("%d\n",query(str));
        }
    }
    
    return 0;
}

五、总结

1.类似于使用字典来进行查询

2.构建Trie来存储和查询字符串,把字符串分解成为一个一个的字符(遍历字符串来实现),给每一个结点一个特定的编号,遍历字符串结束之后,用一个计数器数组来计数或者说标记,把那个特定的编号作为下标(idx),对应的计数器数值增加一,表示字符串结束了

3.存储函数:定义一个p,表示节点,初始值为0,定义一个u,把小写英文字母映射成为0-25数字存在u里面,如果结点是空的,就新建立一个节点,其实是给这个二维数组元素一个特定的编号, 用p来存储这个结点,编号是从1开始增加使用的,也就是说,最小的使用的编号是1。

4.存储函数里面,循环里面有一个步骤,把son[p][u]赋值给p,表示有这个结点,可以继续下一个结点

5.查询函数和存储函数类似:有一个细节说明一下,把英文映射成为数字,减去小写字母a,就可以让a->0,b->1,...,z->25,只要中间有一个结点没有查询出来,就表示没有这个字符串,返回0即可,最后循环结束,返回计数器里面的数值即可

6.输入输出并不复杂

7.学习这个题就感觉非常轻松,kmp是真的难

8.计数器那里说明一下,用下标表示结点,数组元素表示出现的次数,非常巧妙,感觉用pair或者二维数组或者结构体也可以,用数组下标和数组元素数值应该是最简便的

9.遍历的时候,str[]最后一个元素是\0,所以会跳出循环,比较简便

六、精美图片

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

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

相关文章

企业微信如何发起视频直播?

一、如何发起直播 1.【工作台->直播 】应用可发起&#xff1b; 【群聊—“”—群直播】可发起&#xff0c;发起直播时&#xff0c;支持预览直播视频&#xff0c;确认开始直播后则进入直播。 2.在直播应用或群聊工具中支持发起预约直播&#xff0c;可设置开始时间、直播时长…

K8s中的ConfigMap

ConfigMap作用&#xff1a;存储不加密数据到etcd&#xff0c;让Pod以变量或者Volume挂载到容器中 场景&#xff1a;配置文件 3.以Vlolume挂载到Pod容器中

【vue】vue的几个提效技巧:

文章目录 一、动态组件结合v-for循环使用【1】使用环境【2】实际使用【3】编译以后的效果 二、watch进阶使用【1】立即执行【2】深度监听 三、计算属性之setter四、$on(hook:生命周期)来简化window监听五、子组件hook:生命周期监听子组件的生命周期回调六、v-pre七、v-once八、…

Three.js给场景添加背景颜色,背景图,全景图

1.相关API的使用&#xff1a; 1 THREE.Color &#xff08;用于创建和表示颜色&#xff09; 2. THREE.TextureLoader&#xff08;用于加载和处理图片纹理&#xff09; 3. THREE.SphereGeometry&#xff08;用于创建一个球体的几何体&#xff09; 4. THREE.Mesh&#xff08;用…

【C# 基础精讲】条件语句:if、else、switch

条件语句是C#编程中用于根据条件执行不同代码块的关键结构。C#支持if、else和switch三种常见的条件语句&#xff0c;它们允许根据表达式的结果决定程序的执行路径。在本文中&#xff0c;我们将详细介绍这三种条件语句的语法和使用方法。 if语句 if语句用于在给定条件为真&…

有奖活动 | 大咖论道:一同畅聊鸿蒙生态

点击预约直播 活动简介 即日起-2023年9月5日&#xff0c;参与本期活动与大咖一起聊聊鸿蒙新生态&#xff0c;您可以在社区写下对鸿蒙生态的畅想&#xff0c;也可以学习相关课程并获取证书&#xff0c;完成活动任务即可参与精美礼品抽奖。 活动周期 8月1日-9月5日 参与考试 Harm…

逻辑卷扩容

背景 服务器有3个逻辑卷&#xff0c;1个是1T&#xff0c;另外两个是500G&#xff0c;需要将500G的合并扩容为1T 操作 df -Th lsblk -f 查看磁盘大小卸载 /approot umount /approot vim /etc/fstab #注释掉/approot mount -a检查是否卸载完成 vgdisplay -v 找到approot所在…

重磅!官方Android现代开发指南发布!

重磅&#xff01;官方Android现代开发指南发布&#xff01; 最近查看了google官方Android开发站点&#xff0c;猛然发现页面做了一些改动&#xff0c;新增了一个专题tab页&#xff0c;增加了一个UI开发指南模块&#xff0c;该模块整合了Jetpack Compose、Jetpack架构组件及Mat…

elementui实现当前页全选+所有全选+翻页保持选中状

原文来自&#xff1a;https://blog.csdn.net/sumimg/article/details/121693305?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

2023 华数杯全国大学生数学建模竞赛 ——C题母亲身心健康对婴儿成长的影响 完整建模+代码

目录 完整思路下载链接&#xff1a;这里可以获取2023华数杯全国大学生数学建模竞赛题目C 题母亲身心健康对婴儿成长的影响✅ 问题1问题1建模思路✅ 问题2问题2建模思路✅ 问题3问题3建模思路✅ 问题4问题4建模思路✅ 问题5问题5建模思路提供的数据和资料&#xff1a; 完整思路下…

【我们一起60天准备考研算法面试(大全)-第四十天 40/60】【并查集】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

云专线的应用场景

云专线是连接用户本地数据中心和云上虚拟私有云的高安全、高速度、低延迟、稳定可靠的专属连接通道&#xff0c;主要有以下应用场景。 1、混合云环境&#xff1a;企业在私有云和公有云之间传输数据及部署应用时&#xff0c;使用云专线建立专用的网络连接&#xff0c;保证数据传…

做赴日IT工作 Java Python等语言哪个更好?

很多同学问我&#xff0c;做赴日IT工作Java&#xff0c;Python等语言哪个更好&#xff1f;更容易拿到内定通知书&#xff1f;如果你想去做赴日IT工作&#xff0c;无论是学Java还是Python或是其他编程语言&#xff0c;都是很好的选择&#xff0c;因为它们都有自己的的前景和应用…

如何快速完成MySQL数据的差异对比|NineData

在现代商业环境中&#xff0c;数据库是企业存储核心数据的重要工具&#xff0c;而 MySQL 作为最受欢迎的关系型数据库管理系统&#xff0c;广泛应用于各行各业。在容灾、数据迁移、备份恢复等场景下&#xff0c;为了确保两端或多端之间数据的一致性&#xff0c;通常需要对数据进…

【C++】多态(多态的构成条件,虚函数重写,override,final,覆盖隐藏对比)

文章目录 前言一、多态的定义及实现1.多态的构成条件&#xff1a; 二、虚函数1.虚函数的重写2.虚函数重写的例外&#xff08;协变&#xff09;3.析构函数的虚函数&#xff08;基类与派生类析构函数名字不同&#xff09;1.不加virtual的一般情况&#xff1a;2.不加virtual会出现…

Merge和Rebase的区别

Merge 和 Rebase 是 Git 中常用的两种分支整合方式&#xff0c;它们具有不同的工作原理和效果&#xff1a; Merge&#xff08;合并&#xff09; 合并是将两个或多个分支的提交历史合并为一个新的提交。在合并时&#xff0c;Git 会创建一个新的合并提交&#xff0c;将两个分支…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…