Trie字符串统计

题目传送门:835.Trie字符串统计

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

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

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

输入格式

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

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

输出格式

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

每个结果占一行。

数据范围

1≤N≤2∗1e4

输入样例:
5
I abc
Q abc
Q ab
I ab
Q ab
输出样例:
1
0
1
试题解析
算法分析

本题使用Trie树的方法。
Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。

Trie树的每一个节点都有对应的字符指针,我们可以根据这个性质来进行字符串的插入

试题解析

本题插入的字符串都为小写字母,所以每一个字符的下一个元素都为小写字母,只需要申请26个空间即可存储。
我们可以通过一个二维数组son来记录每一步的插入操作,son[p][u]的p为当前节点,u为下一个节点的字母,每一个字母插入后都进行存储,最后再进行字符串结尾的标记和计数,便可得到最终结果。

模拟Trie树操作如下:

操作过程

初始化:

  • son[][]存储子节点的位置,分支最多26条
  • cnt[]存储以某节点结尾的字符串个数并起标记作用
  • idx表示当前要插入的节点是第几个,每创建一个节点值+1

插入操作:

p为当前节点,u为下一个字母对应的二维数组的位置,每一次新字母插入时,都给其赋值为++idx,即是下一个元素。
然后更新p的值,直到字符串遍历完成,cnt为字符串结束标志,并能起计数作用。

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]; //返回字符串出现次数
}
完整代码
#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 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;
}

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

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

相关文章

您与此网站之间建立的连接不安全

连接不安全的主要原因之一是使用不安全的通信协议。在互联网传输中&#xff0c;如果使用的协议不加密&#xff0c;那么数据就容易受到窃听和篡改。另一个可能的原因是网站没有正确配置其安全证书&#xff0c;使得用户的连接没有得到适当的加密保护。 解决方法&#xff1a; 采用…

Jeson nano--安装使用摄像头csi/usb

Jeson nano--安装使用摄像头 一、 安装使用摄像头二、vscode调用摄像头总结 一、 安装使用摄像头 列出与视频设备相关的设备文件 ls /dev/video*显示与 /dev/video0 设备关联的摄像头支持的所有格式及其详细信息。可以查看输出以了解所支持的分辨率、帧率和像素格式等信息。请…

centos docker-compose安装教程-2024最新版 亲测可用

目录 长时间不安装,生疏了,再次记录下 1.下载 2.修改名称 3.提权 4.测试验证 长时间不安装,生疏了,再次记录下 1.下载 官网地址 docker-compose官网地址&#xff1a;https://docs.docker.com/compose/compose-file/compose-file-v3/ #进入目录 cd /usr/local/bin#下载 wg…

LeetCode讲解篇之216. 组合总和 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 使用递归回溯算法&#xff0c;当选择数字num后&#xff0c;在去选择大于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选择了k次&#xff0c;如果数组和等于n则加入结果集 从1开始选择数字&#xff0c;直…

jmeter如何做接口测试?

Jmeter介绍&测试准备&#xff1a; Jmeter介绍&#xff1a;Jmeter是软件行业里面比较常用的接口、性能测试工具&#xff0c;下面介绍下如何用Jmeter做接口测试以及如何用它连接MySQL数据库。 前期准备&#xff1a;测试前&#xff0c;需要安装好Jmeter以及jdk并配置好jdk环…

基于时域有限差分法的FDTD的计算电磁学算法-YEE网格下的更新公式推导

基于时域有限差分法的FDTD的计算电磁学算法&#xff08;含Matlab代码&#xff09;-YEE网格下的更新公式推导 参考书籍&#xff1a;The finite-difference time-domain method for electromagnetics with MATLAB simulations&#xff08;国内翻译版本&#xff1a;MATLAB模拟的电…

LLM之RAG理论(五)| 使用知识图谱增强RAG

知识图谱&#xff08;KG&#xff09;或任何图都包括节点和边&#xff0c;其中每个节点表示一个概念&#xff0c;每个边表示一对概念之间的关系。本文介绍一种将任何文本语料库转换为知识图谱的技术&#xff0c;本文演示的知识图谱可以替换其他专业知识图谱。 一、知识图谱 知识…

Postman接口测试之断言,全网最细教程没有之一!

一、断言 在 postman 中我们是在Tests标签中编写断言&#xff0c;同时右侧封装了常用的断言&#xff0c;当然 Tests 除了可以作为断言&#xff0c;还可以当做后置处理器来编写一些后置处理代码&#xff0c;经常应用于&#xff1a; 【1】获取当前接口的响应&#xff0c;传递给…

JavaScript的一道题型

这道题我觉得考察的知识点蛮多的&#xff0c;就单独拿出来了&#x1f92d; <html> <head><title>Title</title> </head> <body> <input type"button" value"全选" id"qx"> <input type"butto…

关于编程的一些小小记录

这里记录一些关于编程的小技巧吧&#xff0c;算是个记录 1&#xff0c;vs同时有多个cpp文件怎么办&#xff1f; 我们只想运行第一个cpp文件&#xff0c;那么怎么做呢&#xff1f; 其实很简单&#xff0c;单击你不想让之运行的文件&#xff0c;点击最下面的属性 最后设置为这样…

强化学习应用(五):基于Q-learning算法的无人车配送路径规划(通过Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法&#xff0c;用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤&#xff1a; 1. 定义环境&#xff1a;确定问题的状态和动作空间&#xff0c;并…

最小花费-银行转账-图的最短路-超详细解析注释

最小花费-银行转账-图的最短路-超详细解析注释 【题目描述】 在n个人中&#xff0c;某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费&#xff0c;请问A最少需要多少钱使得转账后B收到100元。 …

office办公技能|word中的常见通配符使用

一、删除Word中含有指定内容的整行 操作方法&#xff1a; 1、快捷键 CtrlH&#xff0c;打开Word的查找替换窗口&#xff0c;单击【更多】按钮&#xff0c;勾选“使用通配符”。 2、在查找内容处&#xff0c;输入“替换内容*^13”&#xff0c;替换为处什么都不填。 3、单击【…

现阶段Python和Java哪个更吃香?

现阶段Python和Java哪个更吃香&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

2024年最新版 springboot+vue整合支付宝沙箱支付功能,一步一步带您实现完整的支付宝支付功能

目录 1、进入支付宝开放平台 1.1 登录支付宝账号后下拉选择网页/移动应用开发​编辑 1.2 创建网页应用​编辑 1.3 创建成功后进入沙箱 1.4 点击启用公钥&#xff08;有重要作用&#xff01;springboot整合时会用到&#xff09;​编辑 2、开始springboot与支付宝沙箱的整…

2024年【山东省安全员C证】考试及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试是安全生产模拟考试一点通总题库中生成的一套山东省安全员C证复审考试&#xff0c;安全生产模拟考试一点通上山东省安全员C证作业手机同步练习。2024年【山东省安全员C证】考试及山东省安全员C证复…

电影《潜行》中说的蜜罐是什么(网络安全知识)

近期刘德华、彭于晏主演的电影《潜行》在网上掀起了轩然大波&#xff0c;电影中有提到网络蜜罐&#xff0c;这引起了很多观众的疑问&#xff0c;蜜罐到底是什么&#xff1f; 从字面意思上来看&#xff0c;蜜罐就是为黑客设下的诱饵。这是一种具有牺牲性质的计算机系统&#xff…

JS中的File(二):TypedArray和ArrayBuffer详解

目录 一、TypedArray 1、定义 2、注意事项 二、ArrayBuffer 1、定义和构造 2、属性 3、方法 4、使用意义 三、Blob、TypedArray和ArrayBuffer的互相转换 1、websocket接收arrayBuffer 2、blob转arrayBuffer 3、arrayBuffer to Blob 4、ArrayBuffer to Uint8数组&am…

机器人跟踪性能量化指标

衡量机械臂关节轨迹跟踪控制的性能可以通过以下几个方面来进行&#xff1a; 跟踪精度&#xff1a;这是衡量机械臂关节轨迹跟踪控制性能的最重要的指标。它反映了机械臂实际运动轨迹与期望运动轨迹之间的偏差。跟踪精度越高&#xff0c;说明机械臂的控制性能越好。运动范围&…