Trie树,并查集的简单应用(AcWing)

news/2025/1/3 3:51:27/

Trie树

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。

 在每一个单词的结尾需要进行标记,统计个数

现在对上述样例进行模拟

 Trie字符串统计

AC代码:

#include<iostream>
using namespace std;
const int N=100010;
int son[N][26],cnt[N],idx,m;
char str[N];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]++;//计数
}int find(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(void)
{scanf("%d",&m);while(m--){char op[5];scanf("%s %s",op,str);if(op[0]=='I'){insert(str);}else{printf("%d\n",find(str));}}return 0;
}

 并查集

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。

首先创建三个集合,由图可知,每一个点都可以逐级找到自己的祖宗节点,如果祖宗节点相同,那么就是在同一个集合当中,但每一次查找都一个一个找的话效率是十分低效的,因此我们可以采用路径压缩,就是当走完了一个集合之后,我们将这个集合中的所有节点全部指向祖宗节点,那么下一次查找的时间复杂度就是O(1)了,大大提高了查找效率 

这个操作可以在递归的过程中实现。

int find(int x)
{if(p[x]!=x)p[x]=find(p[x]);return p[x];
}

之前说到了,判断一个是不是属于同一个集合,就判断他们的祖宗节点是否一样,如果一样,这两个节点就是在同一个集合当中,那么合并A B两个节点,那么我们可以让A节点的祖宗节点设置为B的祖宗节点,那么A B这两个集合就合并了

合并集合

AC代码: 

#include<iostream>
using namespace std;
const int N=100010;
int p[N],n,m;int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}int main(void)
{scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) p[i]=i;while(m--){char op[5];int a,b;scanf("%s",op);if(op[0]=='M'){scanf("%d %d",&a,&b); p[find(a)]=p[find(b)];}else{scanf("%d %d",&a,&b);if(p[find(a)]==p[find(b)]) puts("Yes");else puts("No");}}return 0;
}

连通块中点的数量

 这题中的连通块我们可以看作集合中的元素,连接起来的连通块就是在一个集合当中,这题和上一题的区别就在于多了一个size大小,我们还需要维护一个size数组来记录当前集合中的元素个数,记录的方法就是当合并两个集合的时候,将A集合的size直接加到B集合中即可

AC代码

#include<iostream>
using namespace std;
const int N=100010;
int p[N],sz[N],n,m,a,b;int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}int main(void)
{scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) {p[i]=i;sz[i]=1;}while(m--){char op[5];scanf("%s",op);if(op[0]=='C'){scanf("%d %d",&a,&b);if(find(a)==find(b)) continue;sz[find(a)]+=sz[find(b)];p[find(b)]=p[find(a)];}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", sz[find(a)]);}}return 0;
}


http://www.ppmy.cn/news/8282.html

相关文章

我亲身经历的2022年软件质量工作——测试工作的经验总结及一些建议

2022年对于大部分人来说都是辛苦的一年。对于整个社会&#xff0c;疫情反反复复&#xff0c;折磨的每一个人都心力交瘁。 经济下滑&#xff0c;失业率上升似乎听到的都是不好的消息。对于整个互联网行业也频频传出大厂裁员的消息。 而质量团队在大厂的裁员计划里也是首当其冲。…

小米手机不为人知的秘密—后台静默安装任何应用

导读你是否拥有一台小米&#xff0c;HTC&#xff0c;三星或者是一加的 Android 手机呢&#xff1f;如果回答是肯定的&#xff0c;那么你应该意识到&#xff0c;几乎所有的智能手机厂商提供的定制 ROM&#xff0c;如 CyanogenMod、Paranoid Android、 MIUI 或者一些其它的 ROM 都…

CycloneDDS(5)发现Discovery

1、Topic Discovery 主题发现允许使用内置主题宣告器和检测器端点在端点之间交换主题信息,如DDS RTPS规范第8.5节所述。主题发现基于SEDP协议。 本文档描述了Cyclone DDS中主题发现实现的设计。首先描述了DDSC和DDSI层中用于主题发现的类型(实体)。下一节将介绍使用…

Vue 总结一(简介 基本语法)

目录 Vue 是什么 与其它 JS 框架的关联 Vue 周边库 MVVM模型 怎么用 Vue模板语法有2大类&#xff1a; 数据绑定 data 事件 v-on methods 计算属性 computed 监视属性 watch computed和watch之间的区别&#xff1a; 条件渲染 v-if v-show Vue 是什么 一个动态构建用…

html+css设计两个摆动的大灯笼

实现效果 新年马上就要到了&#xff0c;教大家用htmlcss设计两个大灯笼&#xff0c;喜气洋洋。 html代码&#xff1a; html代码部分非常简单&#xff0c;将一个灯笼分成几部分进行设计&#xff0c;灯笼最上方部分&#xff0c;中间的线条部分和最下方的灯笼穗。组合在一起就…

Python和MySQL对比(2):用Pandas 实现MySQL的 union 和 join 语法效果

文章目录一、前言二、语法对比数据表unionjoin1、两表 inner join2、两表 left join3、两表 right join4、两表 outer join5、多表 join三、小结一、前言 环境&#xff1a; windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的union和join如何使用pandas实现…

[Kettle] 认识Kettle

1.初识Kettle Kettle是ETL数据整合与处理工具&#xff0c;翻译成中文是"水壶"的意思&#xff0c;可理解为希望把各种数据放到一个壶里&#xff0c;像水一样以一种指定的格式流出&#xff0c;表达数据流的含义 ETL(Extract - Transform - Load)是将数据从数据来源端…

使用kubeadm安装kubernetes记录

1.查看版本信息 # 在 master 节点和 worker 节点都要执行 cat /etc/redhat-release# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字 # 不能使用 localhost 作为节点的名字 hostname# 请使用 lscpu 命令&#xff0c;核对 CPU 信息 # Architecture: x86_64 …