Trie 字典树(c++)(前缀)

news2024/12/24 8:55:47

题目链接:用户登录

题目:

样例:

输入
5 3
aaa
aba
aabbaa
abbbbb
cdd
aabba
abc
abab
输出
Y
N
N

思路:

        根据题目意思,要用到 Trie 字典树算法。

Trie 字典树,顾名思义,“字典”,我们查字典的时候,都是找开头的几个字符,来获取我们的整个字符,Trie 字典树,就是通过 前缀字符的一步步扩展。最后查找的时候就是根据我们扩展字典树的步骤来变相查找。字典树,我们也要建立一个 root 跟

比如 :给出以下的几个字符

abcdf

bgre

abfr

baef

最后获得的字典树为:

下面给出 Trie 字典树封装的结构体:


// 定义 Tries 结构体,封装
struct Tries
{
	// son 用于存储 字符,idx 对应映射整数地址
	int son[N][26],idx;
	
	// 构造 Tries 初始化
	inline Tries()
	{
		memset(son,0,sizeof son);
		idx = 0;
	}
	
	// 字符串 插入操作
	inline void Insert(string str)
	{
		int p = 0;	// 对应root根树的 映射地址
		int len = str.size();	// 计算 字符串 的长度,方便遍历
		for(int i = 0;i < len;++i)
		{
			int u = str[i] - 'a';	// 将 单个字符 转化为 映射整数地址
			if(!son[p][u]) son[p][u] = ++idx;	// 如果没有当前 地址,扩展映射
			p = son[p][u];	// 往 存在的结点地址 开始下一次检索
		}
		return ;
	}
	
	// 字符串 查找操作 和 插入操作相似,只是不会新建结点
	inline bool query(string str)
	{
		int p = 0;	// 对应root根树的 映射地址
		int len = str.size();	// 计算 字符串 的长度,方便遍历
		for(int i = 0;i < len;++i)
		{
			int u = str[i] - 'a';	// 将 单个字符 转化为 映射整数地址
			if(!son[p][u]) return false;	// 如果没有当前 地址,扩展映射
			p = son[p][u];	// 往 存在的结点地址 开始下一次检索
		}
		return true;
	}
}tree;

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

// 定义 Tries 结构体,封装
struct Tries
{
	// son 用于存储 字符,idx 对应映射整数地址
	int son[N][26],idx;
	
	// 构造 Tries 初始化
	inline Tries()
	{
		memset(son,0,sizeof son);
		idx = 0;
	}
	
	// 字符串 插入操作
	inline void Insert(string str)
	{
		int p = 0;	// 对应root根树的 映射地址
		int len = str.size();	// 计算 字符串 的长度,方便遍历
		for(int i = 0;i < len;++i)
		{
			int u = str[i] - 'a';	// 将 单个字符 转化为 映射整数地址
			if(!son[p][u]) son[p][u] = ++idx;	// 如果没有当前 地址,扩展映射
			p = son[p][u];	// 往 存在的结点地址 开始下一次检索
		}
		return ;
	}
	
	// 字符串 查找操作 和 插入操作相似,只是不会新建结点
	inline bool query(string str)
	{
		int p = 0;	// 对应root根树的 映射地址
		int len = str.size();	// 计算 字符串 的长度,方便遍历
		for(int i = 0;i < len;++i)
		{
			int u = str[i] - 'a';	// 将 单个字符 转化为 映射整数地址
			if(!son[p][u]) return false;	// 如果没有当前 地址,扩展映射
			p = son[p][u];	// 往 存在的结点地址 开始下一次检索
		}
		return true;
	}
}tree;
int n,k;
string s;
inline void solve()
{
	cin >> n >> k;
	while(n--)
	{
		cin >> s;
		tree.Insert(s);
	}
	while(k--)
	{
		cin >> s;
		if(tree.query(s)) cout << "Y" << endl;
		else cout << "N" << endl;
	}
}

signed main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

竞赛保研 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

大四复习:深入浅出解释拓扑排序

我在大二学习拓扑排序的时候&#xff0c;不是很明白&#xff0c;现在已经大四&#xff0c;抽时间复习一下拓扑排序。 什么是拓扑排序&#xff1f; 如何实现拓扑排序&#xff1f; 拓扑排序的拓展 什么是拓扑排序&#xff1f; 首先拓扑排序的定义如下&#xff1a; 拓扑排序是一…

【C语言】SCU安全项目1-FindKeys

目录 前言 命令行参数 16进制转字符串 extract_message1 process_keys12 extract_message2 main process_keys34 前言 因为这个学期基本都在搞CTF的web方向&#xff0c;C语言不免荒废。所幸还会一点指针相关的知识&#xff0c;故第一个安全项目做的挺顺利的&#xff0c…

龙芯loongarch64服务器编译安装gcc-8.3.0

前言 当前电脑的gcc版本为8.3.0,但是在编译其他依赖包的时候,出现各种奇怪的问题,会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc,替换系统自带的gcc。 环境准备 下载页面:龙芯开源社区网站 - LoongArch GCC 8.3 交叉工具链 - 源码下载源码包名称如:loongson-gnu…

修改antd表单Form.Item的label颜色的方法

默认的Form.item的标签颜色为黑色&#xff0c;但是如果我是用深色背景&#xff0c;这样的情况下表单就看不清楚label了&#xff0c;就像下面的情况&#xff0c;密码两个字完全看不到&#xff0c;所以想把它改为白色字体&#xff0c;就像上面的账号两个字一样&#xff1a; 所以怎…

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

C语言是否已经跟不上社会需求?

今日话题。C语言是否已经跟不上社会需求&#xff1f;一个问题的提出者说&#xff0c;几天前他受到老板的批评&#xff0c;因为他只精通C语言编程&#xff0c;无法满足老板的需求。实际上&#xff0c;C语言在嵌入式行业中仍然具有极高的价值。它高效、可移植&#xff0c;并广泛用…

选择正确的自动化测试工具:打造高效测试流程的必备利器!

摘要 自动化测试正在逐步取代部分手动测试&#xff0c;因为它可以节省时间并提高测试质量。特别是在进行回归测试的情况下&#xff0c;自动化可以通过多种方式提高效率。手动进行重复测试是浪费时间和资源。此外&#xff0c;由于重复测试可能会遗漏&#xff0c;因此存在一定的…

Android Stuido报错处理

仅用作报错记录。防止以后出项问题不知如何解决。 报错1 Dependency‘androidx.annotation:xx requires libraries and applications … 需要修改CompileSDKVersion更改为报错中提示的版本 打开项目build.gradle文件&#xff0c;将compileSdk和targetSdk修改为报错中提示的版…

从数藏到链游,最近爆火的链游理想城,一天直接干爆服务器!

大家好&#xff0c;我是吴军&#xff0c;一家软件开发公司的营销经理 今天我们来聊聊链游以及数字藏品&#xff0c;2022年4月开始&#xff0c;一众数藏平台犹如雨后春笋冒出来&#xff0c;由ibox牵头&#xff0c;开始了一场掘金盛宴&#xff0c;许多大学生都相继入场&#xff…

【1.7计算机组成与体系结构】主存编址计算

目录 1.主存编址2.主存编址计算公式3.例题&#xff1a; 1.主存编址 1bit(比特位) 1B(字节)8bit(比特位) 1KB1024B 1MB1024KB 1GB1024MB 2.主存编址计算公式 &#x1f534;存储单元 存储单元个数最大地址-最小地址1 &#x1f534;编址内容 按字编址:存储体的存储单元是字存储…

专科毕业,应届生零基础如何七天搞定自动化测试?

现在很多测试人员有些急于求成&#xff0c;没有任何基础想当然的&#xff0c;要在一周内上手自动化测试。 在自动化的过程中时候总有人会犯很低级的问题&#xff0c;有语法问题&#xff0c;有定位问题&#xff0c;而且有人居然连__init__.py 文件名都弄错误&#xff0c;还有将…

90%的人学Python爬虫都干过这种事,别不承认!

可以说&#xff0c;我是因为想批量下载一个网站的图片&#xff0c;才开始学的python爬虫。当一张一张图片自动下载下来时&#xff0c;满满的成就感&#xff0c;也满满的罪恶感……哈哈哈&#xff01;&#xff01;&#xff01;窈窕淑女&#xff0c;君子好逑&#xff0c;这篇文章…

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…

C/C++函数递归的趣味题

1、汉诺塔问题 题目&#xff1a; 先来分析一下当圆盘数较小时的操作步骤。 代码 //递归求解汉诺塔问题 void move(char, char); void HanoiTower(int, char, char, char); int main() {cout << "请输入A柱上的圆盘数量&#xff1a;";int n;cin >> n;Han…

Java研学-JavaScript 进阶

一 JS 的 DOM 1 概述 DOM 是 Document Object Model 文档对象模型的缩写。根据 W3C 的 DOM 规范&#xff0c;它是一种与浏览器&#xff0c;平台&#xff0c;语言无关的接口&#xff0c;能够动态地修改 XML 和 HTML。   D&#xff1a;文档 – HTML文档 或 XML 文档   O&…

物联网在能源管理中的应用——青创智通工业物联网解决方案

随着全球能源资源的日益紧张和环境问题的日益突出&#xff0c;能源管理已成为当今社会的重要议题。物联网技术的快速发展为能源管理提供了新的解决方案。本文将介绍物联网在能源管理中的应用及其优势。 一、物联网在能源管理中的应用 1. 智能电网 智能电网是物联网在能源管理中…

【基于BP神经网络的房价预测系统设计与实现】

基于BP神经网络的房价预测系统设计与实现 摘要1. 引言2. 数据获取与预处理3. 数据分析与可视化4. 系统功能设计4.1 用户登录注册4.2 房价数据展示4.3 房价变化趋势4.4 各区房价对比4.5 房间数和朝向分析4.6 房价预测 5. 创新点与意义6. 结论与展望结尾 摘要 本文介绍了一项基于…

Video anomaly detection with spatio-temporal dissociation 论文阅读

Video anomaly detection with spatio-temporal dissociation 摘要1.介绍2.相关工作3. Methods3.1. Overview3.2. Spatial autoencoder3.3. Motion autoencoder3.4. Variance attention module3.5. Clustering3.6. The training objective function 4. Experiments5. Conclusio…