算法学习08:Trie树(字典树)、并查集

算法学习08:Trie树(字典树)、并查集


文章目录

  • 算法学习08:Trie树(字典树)、并查集
  • 前言
  • 一、Trie树(字典树)
  • 二、并查集
    • 1.例题1:合并 + 判断
    • 2.例题2:合并 + 判断 + 元素个数(连通图/块)
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、Trie树(字典树)

在这里插入图片描述



例题:维护一个字符串集合,支持两种操作:
(1)向集合中插入字符串x
(2)询问一个字符串在集合中出现了多少次



#include <iostream>

using namespace std;

const int N = 1e5 + 10;

char str[N];// 字符串 

//idx:表示当前结点 位置 
int son[N][26], cnt[N], idx;//下标是0的点,既是根节点,又是空节点

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];// 移动 
	}
	cnt[p] ++;// 字符串结尾 计数+1 
 } 
 
 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);// 向集合中插入字符串x
	 	else printf("%d\n", query(str));// 询问一个字符串在集合中出现了多少次
	  } 
 	return 0;
 }


二、并查集

1.例题1:合并 + 判断

在这里插入图片描述



在这里插入图片描述



例题:一共用n个数,编号是1~n,最开始每个数各自在一个集合中。
(1)将编号为a和b的两个数所在的集合合并
(2)询问编号为a和b的两个数是否在同一个集合中



#include <iostream>

using namespace std;

const int N = le5 + 10;

int n, m;
int p[N];

int find(int x)//返回x的祖宗结点 + 路径优化(递归) 
{
	if(p[x] != x) p[x] = find(p[x]);
	return p[x]; 
 } 
 
 int main()
{
	scanf("%d%d", &n, &m);
	
	for(int i = 1; i <= n; i ++) p[i] = i;// 数据输入 
		
	while(m --)
	{
		// 用 字符串 读取 字符 效果更好 
		// 可以避免读入空格 
		char op[2];
		int a, b;
		scanf("%s%d%d", op, &a, &b);
		
		if(op[0] == 'M') p[find(a)] = find(b);//合并集合 
		else
		{
			//判断a和b是否属于同一个集合 
			if(find(a) == find(b)) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

2.例题2:合并 + 判断 + 元素个数(连通图/块)

在这里插入图片描述



例题2:给定一个包含n个点(编号为1~n)的无向图,初始时,途中没有边。
现在有进行m个操作,操作有3种:
(1)在点a、b之间连一条边,a和b可能相等
(2)询问a、b是否在同一个连通块中
(3)询问点a所在连通块中 点的数量



#include <iostream>

using namespace std;

const int N = le5 + 10;

int n, m;
int p[N], size[N];//p:数据存储的地方 size:集合中元素的数量 

int find(int x)//返回x的祖宗结点 + 路径优化(递归) 
{
	if(p[x] != x) p[x] = find(p[x]);
	return p[x]; 
 } 
 
 int main()
{
	scanf("%d%d", &n, &m);
	
	for(int i = 1; i <= n; i ++) 
	{
		p[i] = i;
		size[i] = 1;// 每个都有 
	 } 
		
	while(m --)
	{
		// 用 字符串 读取 字符 效果更好 
		// 可以避免读入空格 
		char op[5];
		int a, b;
		scanf("%s", op);
		
		if(op[0] = 'C') 
		{
			scanf("%d%d", &a, &b);
			// 如果a、b不属于同一个集合,那么合并,size也要增加 
			if(find(a) == find(b)) continue;//1
			size[find(b)] += size[find(a)];//2
			p[find(a)] = find(b);
		}
		else if(op[1] == '1')
		{
			scanf("%d%d", &a, &b);
			if(find(a) == find(b)) puts("Yes");
			else puts("No");
		}
		else
		{
			scanf("%d", &a);
			printf("%d\n", size[find(a)]);
		}
	}
	return 0;
}

总结

提示:这里对文章进行总结:

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

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

相关文章

ChatGPT发不出消息?GPT发不出消息怎么办?

前言 今天发现&#xff0c;很多人的ChatGPT无法发送信息&#xff0c;我就登陆看一下自己的GPT的情况&#xff0c;结果还真的无法发送消息&#xff0c;ChatGPT 无法发送消息&#xff0c;但是能查看历史的对话&#xff0c;不过通过下面的方法解决了。 第一时间先打开官方的网站&a…

STM32---通用定时器(一)理论基础

写在前面&#xff1a;在STM32F103中有众多的定时器&#xff0c;其中包括两个基本定时器&#xff0c;基本定时器的内容已经在上节进行了介绍&#xff0c;基本定时器的功能、结构、使用都较为简单。而STM32F1中还含有4个通用定时器&#xff08;TIM2\3\4\5&#xff09;,这些定时器…

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理一、Unity中 屏蔽透明区域的点击事件1.1 使用Image组件自带的参数检测1.2 根据点击的坐标计算该点的像素值是否满足阈值 二、Unity中屏蔽 不规则图片按钮点击的事件 总结 &#x1f3ac; 博客主页&#xff1a;htt…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

JVM知识整体学习

前言&#xff1a;本篇没有任何建设性的想法&#xff0c;只是我很早之前在学JVM时记录的笔记&#xff0c;只是想从个人网站迁移过来。文章其实就是对《深入理解JVM虚拟机》的提炼&#xff0c;纯基础知识&#xff0c;网上一搜一大堆。 一、知识点脑图 本文只谈论HotSpots虚拟机。…

2024年腾讯云8核16G服务器性能测试和并发数测试

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…

开源的Java图片处理库介绍

在 Java 生态系统中&#xff0c;有几个流行的开源库可以用于图片处理。这些库提供了丰富的功能&#xff0c;如图像缩放、裁剪、颜色调整、格式转换等。以下是几个常用的 Java 图片处理库的介绍&#xff0c;包括它们的核心类、主要作用和应用场景&#xff0c;以及一些简单的例子…

spring-cloud-openfeign 3.0.0之前版本(对应spring boot 2.4.x之前版本)feign配置加载顺序

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

Linux:kubernetes(k8s)prestop事件的使用(10)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

在当今快节奏的开发环境中&#xff0c;实现无缝、稳健的 CI/CD 流水线对于交付高质量软件至关重要。在本文中&#xff0c;我们将向您介绍使用 Bitbucket Pipeline、ArgoCD GitOps 和 AWS EKS 设置部署的步骤&#xff0c;所有步骤都将利用 Terraform 的强大功能进行编排。在Part…

Linux 之二:CentOS7 的 IP 常用命令和配置及 xshell 基本使用方法

1. 进入虚拟机 点击右键---进入终端--输入 ip adrr 或 ifconfig 查看ip地址 下面输入命令 ifconfig&#xff08;注意&#xff1a;不是 ipconfig &#xff09; 或 ip addr 来查看当前系统 IP 查看到IP 后&#xff0c;比如&#xff1a;上面是 192.168.184.137 1.1 IP 常用命令…

[VulnHub靶机渗透] Nullbyte

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【MATLAB】MATLAB学习笔记

MATLAB入门 基础操作变量命名数据类型逻辑和流程控制循环结构分支结构 绘图基本操作二维平面绘图绘图参数三位立体绘图图像窗口的分割 本文参考B站视频&#xff1a;BV13D4y1Q7RS 由于我对于C语言很熟悉&#xff0c;很多语法是会参考C来学 基础操作 清屏%% 清空环境变量及命令 …

前端vite+vue3——可视化页面性能耗时指标(fmp、fp)

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐可视化fmp、fp指标&#x1f496; MutationObserver 计算 dom的变化&#x1f496; 使用条形图展示 fmp、fp时间 ⭐项目代码⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端vitevue3——可视化页面性能耗时…

论文阅读:Diffusion Model-Based Image Editing: A Survey

Diffusion Model-Based Image Editing: A Survey 论文链接 GitHub仓库 摘要 这篇文章是一篇基于扩散模型&#xff08;Diffusion Model&#xff09;的图片编辑&#xff08;image editing&#xff09;方法综述。作者从多个方面对当前的方法进行分类和分析&#xff0c;包括学习…

图像处理与图像分析—图像的读入(C语言)

学习将会依据教材图像处理与图像分析基础&#xff08;C/C&#xff09;版内容展开 什么是数字图像处理 一副图像可以定义为一个二维函数 f(x&#xff0c;y) &#xff0c;其中 x 和 y 是空间&#xff08;平面&#xff09;坐标&#xff0c;任意一对空间坐标 (x,y) 处的幅度值 &am…

了解 HTTPS 中间人攻击:保护你的网络安全

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

二叉树进阶--二叉搜索树的进一步优化--AVL树 Self-balancing binary search tree

前言&#xff1a; 在上一次的文章中&#xff0c;我们详细介绍了二叉树的进阶树型&#xff0c;即BS树(二叉搜索树),但在文章的结尾&#xff0c;二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表…

golang实现正向代理和反向代理

文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…

Redis缓存过期策略

文章目录 一、面试题二、redis内存1. Redis的内存大小怎么查看&#xff1f;2. 设置redis内存3. redis内存的OOM 三、redis内存淘汰策略1. redis的过期键删除策略2. redis缓存淘汰策略 一、面试题 1. 生产上你们redis内存设置多少&#xff1f; 2. 如何配置、修改redis内存大小…