【C++算法模板】字典树,超详细注释带例题讲解

文章目录

    • 0)概述
    • 1)数据结构
    • 2)插入操作
    • 3)查询操作
    • 4)完整代码
      • 1. 字符数组
      • 2. 字符串

视频链接:F06 字典树(Trie)

0)概述

  • 是快速插入和查询字符串的多叉树结构,根节点编号为0,其余节点标识路径,还可以标记单词插入的次数,边表示字符。

在这里插入图片描述

1)数据结构

const int N=1e5+5;
char s[N]; // 每次输入的字符串,N是每个单词的最大长度
int ch[N][26]; // ch[p][j]:从节点p沿着j这条边走到的子节点,边为26个小写字母映射值为0~25
int cnt[N]; // cnt[p]:以节点p结尾的单词的插入次数
int idx; // 遍历因子

2)插入操作

  • insert函数,插入单个单词并建立字典树
// s:单词(字符串)
void insert(char *s) {int p=0; // 根节点编号为0// 枚举字符串每个字符for(int i=0;s[i];i++) {int j=s[i]-'a'; // a~z映射到0~25// 如果这个字符不是儿子节点,创建儿子,p指针再走到儿子if(!ch[p][j]) ch[p][j]=++idx; // 节点编号+1// 如果这个字符是儿子节点,p指针走到儿子节点p=ch[p][j];}cnt[p]++; // 以节点p结尾的单词插入的次数+1 
}

在这里插入图片描述

3)查询操作

  • query函数,得到一个单词被插入的次数
// 查询某个单词出现的
int query(char *s) {int p=0; // 从根节点开始查// 扫描字符串for(int i=0;s[i];i++) {int j=s[i]-'a'; // 转换为映射值if(!ch[p][j]) return 0; // 如果找不到返回0// 有字母s[i],则走下来p=ch[p][j];}// 如果能走到词尾,则返回插入次数return cnt[p];
}

4)完整代码

1. 字符数组

#include<bits/stdc++.h>
#define x first
#define y secondusing namespace std;typedef long long ll;
typedef pair<int,int> PII;// 解题思路: 节点表示数字,边表示字符const int N=1e5+5;
char s[N]; // 每次输入的字符串,N是每个单词的最大长度
int ch[N][26]; // ch[p][j]:从节点p沿着j这条边走到的子节点,边为26个小写字母映射值为0~25
int cnt[N]; // cnt[p]:以节点p结尾的单词的插入次数
int idx; // 遍历因子// s:单词(字符串)
void insert(char *s) {int p=0; // 从根节点开始插// 枚举字符串每个字符for(int i=0;s[i];i++) {int j=s[i]-'a'; // a~z映射到0~25// 如果这个字符不是儿子节点,创建儿子,p指针再走到儿子if(!ch[p][j]) ch[p][j]=++idx; // 节点编号+1// 如果这个字符是儿子节点,p指针走到儿子节点p=ch[p][j];}cnt[p]++; // 以节点p结尾的单词插入的次数+1 
}// 查询某个单词出现的
int query(char *s) {int p=0; // 从根节点开始查// 扫描字符串for(int i=0;s[i];i++) {int j=s[i]-'a'; // 转换为映射值if(!ch[p][j]) return 0; // 如果找不到返回0// 有字母s[i],则走下来p=ch[p][j];}// 如果能走到词尾,则返回插入次数return cnt[p];
}int main() {int n;cin>>n;while(n--) {char op;scanf("%s%s",&op,s);if(op=='I') insert(s);else cout<<query(s)<<'\n';}return 0;
}

2. 字符串

#include<bits/stdc++.h>
#define x first
#define y secondusing namespace std;typedef long long ll;
typedef pair<int,int> PII;// 解题思路: 节点表示数字,边表示字符// 文件总长度不超过32K,所以总字符不超过:32K=32*1024
const int N=32*1024+10; 
char s[N]; // 每次输入的字符串,N是每个单词的最大长度
int ch[N][26]; // ch[p][j]:从节点p沿着j这条边走到的子节点,边为26个小写字母映射值为0~25
int cnt[N]; // cnt[p]:以节点p结尾的单词的插入次数
int idx; // 遍历因子// s:单词(字符串)
void insert(string s) {int p=0; // 从根节点开始插// 枚举字符串每个字符for(int i=0;i<s.length();i++) {int j=s[i]-'A'; // a~z映射到0~25// 如果这个字符不是儿子节点,创建儿子,p指针再走到儿子if(!ch[p][j]) ch[p][j]=++idx; // 节点编号+1// 如果这个字符是儿子节点,p指针走到儿子节点p=ch[p][j];}cnt[p]++; // 以节点p结尾的单词插入的次数+1 
}// 查询某个单词出现的
int query(string s) {int p=0; // 从根节点开始查// 扫描字符串for(int i=0;i<s.length();i++) {int j=s[i]-'a'; // 转换为映射值if(!ch[p][j]) return 0; // 如果找不到返回0// 有字母s[i],则走下来p=ch[p][j];}// 如果能走到词尾,则返回插入次数return cnt[p];
}int main() {
//	while(scanf("%s",s)) {
//		insert(s);
//	}ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);string s;while(cin>>s) {insert(s);}cout<<idx+1; // 加上根节点return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Badge)

可以附加在单个组件上用于信息标记的容器组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组件&#xf…

SQLiteC/C++接口详细介绍之sqlite3类(七)

上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;未发表&#xff09; 22.sqlite3_create_collation、sqlite3_create_collation16和sqlite3_creat…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…

.NET开源快速、强大、免费的电子表格组件

前言 今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、快速、强大、免费的电子表格组件&#xff0c;支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式&#xff0c;支持WinForm、WPF和Android平台&#xff1a;ReoGri…

一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换到问题。 背景 在企业级的应用中&#xff0c;通常会分为&#xff0c;开发、联调、生产等多个环…

AJAX 02 案例、Bootstrap框架

AJAX 学习 AJAX 2 综合案例黑马 API01 图书管理Bootstrap 官网Bootstrap 弹框图书管理-渲染列表图书管理-添加图书图书管理-删除图书图书管理 - 编辑图书 02 图片上传03 更换图片04 个人信息设置信息渲染头像修改补充知识点&#xff1a;label扩大表单的范围 AJAX 2 综合案例 黑…

ArrayList 是如何进行扩容的?

典型回答 ArrayList 在添加元素时&#xff0c;会自动进行扩容操作&#xff0c;它的执行步骤如下&#xff1a; 当 ArrayList 的内部数组空间不足以容纳新增的元素时&#xff0c;会触发扩容机制。ArrayList 会创建一个新的更大的数组&#xff0c;通常是当前数组长度的 1.5倍 (可…

Kafka-生产者报错javax.management.InstanceAlreadyExistsException

生产者发送消息到 kafka 中,然后控制台报错 然后根据日志查看 kafka 的源码发现了问题原因 说的是MBean已经注册了,然后报异常了,这样就会导致生产者的kafka注册失败, 原因是项目上生产者没有配置clientId,默认都是空导致的, 多个生产者(项目)注册到kafka集群中的 id 都相同。 …

Maven3.6.3安装与配置,IDEA2022.2.3部署Maven操作步骤

1、先确保安装了Java开发环境&#xff0c;并配置了JAVA_HOME环境变量 WinR ,输入cmd,然后输入命令echo %JAVA_HOME%,查看JDK &#xff0c;接着输入java -version,查看java的版本号 接着系统变量中&#xff0c;配置JAVA_HOME环境变量 2、官网下载MAVEN3.6.3&#xff0c;Maven3.…

【计算机网络】概述 习题

体系结构 练习题 体系结构 真题 时延相关习题 参考公式&#xff1a; 习题1 题解&#xff1a; 发送时延1b 然后通过传播时延传到对面。即1b的发送时延剩下的传播时延 习题1扩展&#xff1a; 将距离修改为20米&#xff0c;其他条件不变。 将距离修改为10米&#xff0c;其他条…

sqllab第二十二关通关笔记

知识点&#xff1a; cookie注入报错注入 直接抓取对应的数据包&#xff0c;发现还是一个cookie注入 参数值被base64加密了 测试这里使用什么手段读取输入 构造payload:uname1 base64加密&#xff1a;MSc 出现了hacker的页面&#xff0c;说明信息错误但是单引号没起作用 使…

Node.js入门基础—day01

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 初识node.js什…