字典树算法(C/C++)

news2024/11/25 2:49:41

目录

一、字典树算法的概念介绍

二、字典树算法的实现

三、例题


(注:借鉴蓝桥杯国赛特训营)

一、字典树算法的概念介绍

首先我们看下字典的组织方式

 

Trie 的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

我们的字典树也是这样的结构,我们如何组织呢?

字典树的组织方式有哪些?

  1. 插入

  2. 查询

  3. 删除

  4. 修改

1. 插入:

字典树的插入,就是将一个单词,插入到现有的字典中,每一个单词的关键字就是他的字符。

  1. 每次插入都要从根节点开始进行。

  2. 根据自身关键字继续向下进行,如果匹配到就沿着匹配到的曾经创建过的分支往下继续匹配关键字。

  3. 根据自身关键字向下进行,如果匹配失败就按照自己的关键字创建分支。

  4. 重复 2,3 直至自身遍历结束。

2. 查询:

字典树的查询就是判断,该单词是否被字典树包含。

与插入一样,从根节点开始,按照自身关键字,选择路径。

不同的是,遇到匹配失败时,返回没有找到,并不创建新的节点。

并且,当关键字用完后,返回查找成功。

3. 删除和修改:

然而删除和修改是不存在的,因为你不知道这个节点是不是自己创建的,是不是还有其他单词在使用,所以我们不能贸然的删除这一个节点。

对于需要删除和修改的,我给出一个方向,对于某个节点我们可以记录访问次数,来代表多少个单词使用过该节点,就能进行删除和修改操作。

当然不在我们本节课的知识范畴内,这种桶排计数加字典树的方式还是比较简单的。

根据我们所构思的字典树,我们可以自己写出代码。

我们依旧使用数组模拟不使用链表的方式。

二、字典树算法的实现

#include <bits/stdc++.h>
using namespace std;

//字典树算法
int trie[10000][30];//
bool end[10000];//判断该层数是否结尾
int tot=1;
//插入
void insert(string str)
{
	int len=str.size();
	int p=1;
	for(int k=0;k<len;k++){
		int ch=str[k]-'a';
		if(trie[p][ch]==0){
			trie[p][ch]=++tot;
		}
		p=trie[p][ch];
	}
	end[p]=true;
}

//检索
bool search(string str)
{
	int len=str.size();
	int p=1;
	for(int k=0;k<len;k++){
		p=trie[p][str[k]-'a'];
		if(p==0){
			return false;
		}
	}
	return end[p];
}

三、例题

(爱找事的小Z)题目描述:

小 Z 同学非常喜欢找事,现在有很多名为“事”的字符串,现在小 Z 想要找“事”,请你帮助他判断,他今天是否找了两件相同的事。

数据范围:

事的输入量不超过10^4,每个"事"字符串的长度不超过1000,且所有字母均为小写。

他看到了两个字符串 s1 s2 ,他想知道 S1 在 S2 中出现了多少次。

输入描述:

第一行输入 n ,为小 z 今天找了多少事
然后,共输入n行

第一行为 事1
第二行为 事2
....

输出描述:

是否找到了两件相同的事,相同输出 1,没有相同的就输出 0

输入输出样例:

  • 样例 1:

Input:

12
acd
acd
asdfsdf
asd
f
saf
asdf
sfasdfs
f
asdf
asf
asdfs

output:

1

  • 样例 2:

Input:

21
adfasdfaasdf
asdfsfas
fa
sdfasd
fsd
fs
a
sda
fsd
afasd
f
sda
f
asdf
as
df
sda
gggggas
dfdsfe
def
a

output:

1
#include<bits/stdc++.h>
using namespace std;

int trie[1000010][30];
int tot=1;
bool endstr[1000010];
int n;

//插入
void insert(string str)
{
	int len=str.size(),p=1;
	for(int k=0;k<len;k++){
		int ch=str[k]-'a';
		if(trie[p][ch]==0){
			trie[p][ch]=++tot;
		}
		p=trie[p][ch];
	}
	endstr[p]=true;
}

//检索
bool search(string str)
{
	int len=str.size(),p=1;
	for(int k=0;k<len;k++){
		p=trie[p][str[k]-'a'];
		if(p==0){
			return false;
		}
	}
	return endstr[p];
}


int main()
{
	cin>>n;
	string s;
	int ans=0;
	for(int i=0;i<n;i++){
		cin>>s;
		if(search(s)){
			ans++;
		}
		else{
			insert(s);
		}
	}
	if(ans){
		cout<<"1";
	}
	else{
		cout<<"0";
	}
	return 0;
}

 

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

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

相关文章

实训总结-----Scrapy爬虫

1.安装指令 pip install scrapy 2.创建 scrapy 项目 任意终端 进入到目录(用于存储我们的项目) scrapy startproject 项目名 会在目录下面 创建一个以 项目名 命名的文件夹 终端也会有提示 cd 项目名 scrapy genspider example example.com 3.运行爬虫指令 scrapy craw…

ffmpeg之AVFormatContext结构体详细解释

AVFormatContext 作用 AVFormatContext主要起到了管理和存储媒体文件相关信息的作用。它是一个比较重要的结构体&#xff0c;在FFmpeg中用于表示媒体文件的格式上下文&#xff0c;其中包含了已经打开的媒体文件的详细信息&#xff0c;包括媒体文件的格式、媒体流的信息、各个媒…

【笔记】使用电脑连接树莓派 并在电脑屏幕上显示树莓派桌面(无需额外为树莓派购买显示器)

一、前言 想在树莓派上跑 yolo5&#xff0c;为了方便地看到代码的检测结果&#xff0c;需要为树莓派外接显示器&#xff0c;但是手头并没有额外的显示器&#xff0c;于是想在电脑屏幕上显示树莓派的桌面&#xff0c;对解决的过程作一些记录。 二、基本流程 树莓派系统的烧录…

c++11 标准模板(STL)(std::bitset)(三)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssign…

【SpringMVC】请求与响应

1&#xff0c;PostMan工具的使用 1. PostMan简介 代码编写完后&#xff0c;我们要想测试&#xff0c;只需要打开浏览器直接输入地址发送请求即可。发送的是GET请求可以直接使用浏览器&#xff0c;但是如果要发送的是POST请求呢? 如果要求发送的是post请求&#xff0c;我们就…

基于前推回代法的连续潮流计算研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从零搭建微服务-网关中心(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 新建 mingyue-gateway 在 【从零搭建微服务…

09 Redis与MySQL数据双写一致性工程落地案例

canal 是什么 canal [kə’nl]&#xff0c;中文翻译为 水道/管道/沟渠/运河&#xff0c;主要用途是用于 MySQL 数据库增量日志数据的订阅、消费和解析&#xff0c;是阿里巴巴开发并开源的&#xff0c;采用Java语言开发&#xff1b;历史背景是早期阿里巴巴因为杭州和美国双机房…

23种设计模式之职责链模式(Chain of Responsibility Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的访问者模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

集群化环境前置准备

集群化环境前置准备 介绍 需要完成集群化环境的前置准备&#xff0c;包括创建多台虚拟机&#xff0c;配置主机名映射&#xff0c;SSH免密登录等等。 部署 配置多台Linux虚拟机 安装集群化软件&#xff0c;首要条件就是要有多台Linux服务器可用。 我们可以使用VMware提供的…

冈萨雷斯DIP第1章知识点

文章目录 1.1 什么是数字图像处理1.3 数字图像处理技术应用领域实例1.4 数字图像处理的基本步骤 1.1 什么是数字图像处理 图像、数字图像 一幅图像可以定义为一个二维函数 f ( x , y ) f(x,y) f(x,y)&#xff0c; 其中 x x x 和 y y y 是空间(平面)坐标&#xff0c; 在坐标…

你真的会性能测试吗?资深测试总结全链路压测(详全)卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是全链路压测…

多分类问题练习

练习3&#xff1a;多分类问题 介绍 在本练习中&#xff0c;我们将使用逻辑回归来识别手写数字&#xff08;0到9&#xff09;。我们将扩展在练习2中对逻辑回归的实现&#xff0c;并将其应用于一对多的分类问题。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&…

【Python开发】FastAPI 08:Security 登录认证

FastAPI 在 fastapi.security 模块中提供了诸多安全性的工具&#xff0c;简化了各种安全机制的使用方法&#xff0c;可用于处理安全性、身份认证和授权等问题&#xff01; 目录 1 介绍 1.1 OAuth2 1.2 OpenAPI 2 安全基础 2.1 使用 Bearer ① OAuth2PasswordBearer ② 使…

开关电源关键参数计算方法

1、源调整率&#xff08;Line Regulation&#xff09;&#xff1a;将待测开关电源以额定输入电压及额定负载状况下热机15 分钟稳定后&#xff0c;分别于输入电压的下限、额定输入电压(Normal)、输入电压的上限测量并记录各自对应的输出电压值为 V1、V0&#xff08;normal&#…

Linux NGINX服务 ReWrite^location

ReWrite^location 从功能看 rewrite 和 location 似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于 rewrite 是在同一域名内更改获取资源的路径&#xff0c;而 location 是对一类路径做控制访问或反向代理&#xff0c;还可以proxy_pass 到其他机器。 rewrite 对访问…

Nginx正则表达式、location匹配、Rewrite重写详解

Nginx正则表达式、location匹配、Rewrite重写详解 一、常用的Nginx正则表达式二、location匹配概述1、location大致可以分为三类2、location常用的匹配规则3、location 优先级4、location 示例说明5、实际网站使用中&#xff0c;至少有三个匹配规则定义 三、rewrite重写1、rewr…

果推断16--基于反事实因果推断的度小满额度模型学习笔记

目录 一、原文地址 二、一些问题 2.1如何从RCT随机样本过渡到观测样本因果建模&#xff1f; 2.2反事实学习的核心思想 2.3度小满的连续反事实额度模型 Mono-CFR 2.4Mono-CFR代码实现&#xff08;待补充&#xff09; 2.5CFR学习 2.5.1CFR 2.5.2DR-CFR 参考 一、原文地…

Spring Cloud Alibaba — Nacos 构建服务注册中心

文章目录 Nacos Server下载启动登录创建命名空间 Nacos Client启动样例Nacos 服务发现配置项 集成 OpenFeign 远程接口调用添加 OpenFeign 依赖开启 EnableFeignClients 注解编写远程服务接口远程接口调用 集成 Sentinel 熔断降级添加 Sentinel 依赖开启 Sentinel 熔断降级编写…

【数据结构每日一题】链表——单链表重排

[数据结构习题]链表——单链表重排 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——顺序存储 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——链式存储 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p …