Trie(算法版)

#include <iostream>

using namespace std;

const int N=100010;
int son[N][26],cnt[N],idx;
//son记录trie数,cnt记录每个词出现的次数,idx记录每个字符所占⽤的下标

//加入字符串
void add(char str[]){
	//idx = 0既表⽰根节点也表⽰空节点
	int p =0;
	for(int i =0;str[i];i++){  //字符串末尾为0
		int u = str[i]-'a';
		if(!son[p][u]){
			son[p][u]= ++idx;//当前字符不存在,增加
		}
		p=son[p][u];  //向下继续遍历
	}
	cnt[p]++;  //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;//若没找到,直接返回0
		}
		p=son[p][u];
	}
	return cnt[p];  //p指向字符串的最后一个字符
}

int main(){
	int n;
	cin>>n;
	while(n--){
		char op;
		char x[N];
		cin>>op>>x;
		if(op=='I')add(x);
		else cout<<query(x)<<endl;
	}

	return 0;

}

假设情境 1096:我们有一个 Trie 树,开始时是空的。我们现在要插入以下两个单词:cat 和 car。

 

初始状态:

 
  • idx:初始值为 0,表示根节点。
  • son [N][26]:所有元素初始值为 0,表示 Trie 树是空的。
 

插入 “cat”:

 
  1. 字符 'c':
    • 计算索引 u = 'c' - 'a' = 2。
    • 检查 son [0][2],因为 Trie 树是空的,所以 son [0][2] 为 0。由于 son [0][2] 为 0,意味着当前节点 0 没有对应字符 'c' 的子节点。因此,我们创建一个新节点 1,并将 son [0][2] 设为 1,表示根节点 0 的 'c' 子节点是节点 1。
    • 然后,将 p 更新为 1,即移动到节点 1。
    • idx 增加到 1。
  2. 字符 'a':
    • 计算索引 u = 'a' - 'a' = 0。
    • 检查 son [1][0],此时 son [1][0] 仍为 0,因为之前还没有插入任何以 'a' 为第二个字符的单词。
    • 因此,我们创建一个新节点 2,并将 son [1][0] 设为 2。
    • 将 p 更新为 2,现在指向节点 2。
    • idx 增加到 2。
  3. 字符 't':
    • 计算索引 u = 't' - 'a' = 19。
    • 检查 son [2][19],此时 son [2][19] 为 0,因为还没有插入任何以 't' 为第三个字符的单词。
    • 创建新节点 3,并将 son [2][19] 设为 3。
    • p 更新为 3,现在指向节点 3。
    • idx 增加到 3。
    • 此时,已成功插入 “cat”。p 当前指向节点 3,在 cnt [3] 上加 1,表示有一个单词以 't' 结尾。
 

再插入 “car”:

 
  1. 字符 'c':
    • 计算索引 u = 'c' - 'a' = 2。
    • 检查 son [0][2],此时 son [0][2] 为 1,表示根节点已经有一个 'c' 子节点,指向节点 1。
    • 直接将 p 更新为 1,不用创建新节点。
  2. 字符 'a':
    • 计算索引 u = 'a' - 'a' = 0。
    • 检查 son [1][0],此时 son [1][0] 为 2,表示节点 1 有一个 'a' 子节点,指向节点 2。
    • 将 p 更新为 2。
  3. 字符 'r':
    • 计算索引 u = 'r' - 'a' = 17。
    • 检查 son [2][17],此时 son [2][17] 为 0,因为还没有插入任何以 'r' 为第三个字符的单词。
    • 创建新节点 4,并将 son [2][17] 设为 4。
    • p 更新为 4。
    • idx 增加到 4。
    • 现在已成功插入 “car”。p 当前指向节点 4,在 cnt [4] 上加 1,表示有一个单词以 'r' 结尾。
 

总结:
每当我们遇到一个新的字符且当前节点没有对应的子节点时(即 son [p][u] 为 0),我们就需要创建一个新的节点,并更新 son [p][u] 为新节点的编号。同时,idx 自增,用于分配新节点的编号。通过这种方式,Trie 树可以动态地构建,插入和查询操作都能高效完成。

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

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

相关文章

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…

【面试宝典】Java中创建线程池的几种方式以及区别

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 创建线程池有多种方式&#xff0c;主要通过 Java 的 java.util.concurrent 包提供的 Executors 工具类来实现。以下是几…

Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一&#xff0c;它的作用是为电脑的各个部件提供冷却&#xff0c;防止电脑过热。然而&#xff0c;有时候我们会发现电脑风扇的声音特别大&#xff0c;不仅影响我们的使用体验&#xff0c;也可能是电脑出现了一些问题。那么&#xff0c;电脑风扇声音大…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

.Net Core微服务入门系列(一)——项目搭建

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 今天在写Harmony NEXT版本的元服务的时候&#xff0c;突然模拟器无法启动了&#xff0…

WPS数据分析000004

目录 一、表格阅读技巧 冻结窗格 拆分窗口 新建窗口 阅读模式 护眼模式 二、表格打印技巧 打印预览 打印缩放 打印区域 打印标题 分页打印 打印位置 页眉页脚 逐份打印 三、表格保护技巧 锁定单元格 隐藏公式 文档权限 文件加密 一、表格阅读技巧 冻结窗…

LabVIEW桥接传感器数据采集与校准程序

该程序设计用于采集来自桥接传感器的数据&#xff0c;执行必要的设置&#xff08;如桥接配置、信号采集参数、时间与触发设置&#xff09;&#xff0c;并进行适当的标定和偏移校正&#xff0c;最终通过图表呈现采集到的数据信息。程序包括多个模块&#xff0c;用于配置通道、触…

2025西湖论剑-babytrace

前言 就做了下题目&#xff0c;pwn1/3 都是签到&#xff0c;pwn2 后面绕 ptrace 有点意思&#xff0c;简单记录一下 漏洞分析 子进程中的读/写功能没有检查负数的情况&#xff0c;存在越界读写&#xff1a; void __fastcall get_value(__int64 *int64_arr) {__int64 ll; //…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

GPT-5 传言:一场正在幕后发生的 AI 变革

新的一年&#xff0c;让我们从一个引人入胜的话题开始&#xff1a;如果我告诉你&#xff0c;GPT-5 并非虚构&#xff0c;而是真实存在呢&#xff1f;它不仅真实存在&#xff0c;而且正在你看不见的地方悄然塑造着世界。我的基本假设是&#xff1a;OpenAI 已经秘密开发出 GPT-5&…

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…

Leetcode - 周赛432

目录 一、3417. 跳过交替单元格的之字形遍历二、3418. 机器人可以获得的最大金币数三、3419. 图的最大边权的最小值四、3420. 统计 K 次操作以内得到非递减子数组的数目 一、3417. 跳过交替单元格的之字形遍历 题目链接 本题是一道模拟题&#xff0c;第一行走0&#xff0c;2&…

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…