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

news2024/11/15 5:18:36

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.coloradmin.cn/o/131725.html

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

相关文章

C/C++教程-从一个main函数带你走进C、C++的世界

通过文章C语言教程-main函数 我们知道一个程序只有一个main函数; 通过这个文章,学习第一个程序; 程序: #include <stdio.h> int main() {printf("my first programe");return 0; } 输出效果: 很多书籍中的第一个程序都是什么"hello world"…

BurpSuite抓取https数据包配置

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是BurpSuite抓取https数据包配置。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁…

Linux 系统安装 pyenv 简明教程

推荐关注博主的微信公众号 Android安全工程&#xff0c;微信公众号围绕 Android 应用的安全防护和逆向分析为主要的两个点&#xff0c; 分享各种安全攻防手段、Hook 技术、ARM 汇编等 Android 相关的知识 前置条件 gitKali 2022 / Ubuntu 16.04 安装步骤 1. 从远程仓库中克隆…

(十三)大白话一行数据中的多个NULL字段值在磁盘上怎么存储?

文章目录 1、为什么一行数据里的NULL值不能直接存储?2、NULL值是以二进制bit位来存储的3、结合小小案例来思考一行数据的磁盘存储格式4、磁盘上的一行数据到底如何读取出来的?5、今日思考题1、为什么一行数据里的NULL值不能直接存储? 之前我们已经给大家讲了在数据库里一行…

【虚幻引擎UE】UE5 按自定义日期范围筛选数据UI实现

基于UMG_Calendar插件按自定义日期范围筛选数据UI实现 数据一般由后端筛选,本文不作具体说明。 如果需要了解快捷 选择本周范围 以及 数据在前端筛选 如何实现,可私聊咨询。 一、插件下载 官方文档 二、范围筛选界面效果实现 1、打开DEMO关卡,默认是简单日历组件 2、创建…

Apollo浅解3

目录 Namespace Item Namespace与Item Namespace修改 界面操作 存储逻辑 更新Item 创建Item 删除Item Namespace发布 界面操作 存储逻辑 发布版本 发布顺序 题外 Namespace Namespace是配置项的集合&#xff0c;类似于一个配置文件的概念。官网解释的更为全面&a…

01 flv 的 binary 解析

想要看一下 这个 flv 的格式主要因素为 rtsp视频服务 转换为 rtmp服务 转换为前端可用的服务 , 然后 里面有 flv.js 的代码, 因为之前出现了一些问题 flvjs 播放 ws 服务代理的不存在的 rtsp 连接, Cannot read properties of null (reading ‘flushStashedSamples‘) 然后看了…

Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

Problem - C - Codeforces 翻译&#xff1a; Boboniu喜欢位操作。他想和你玩个游戏。 Boboniu给你两个序列的非负整数&#x1d44e;1&#x1d44e;2,…,&#x1d44e;&#x1d45b;&#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45a;。 为每个&#x1d456;(1≤&…

FPGA模拟SENSOR,MIPI CSI-2发送图像到RV1126

FPGA模拟SENSOR&#xff0c;MIPI CSI-2发送图像到RV1126 1&#xff1a;FPGA模拟Sensor&#xff0c; 使用MIPI CSI-2 Transmit&#xff0c;发送图像到RV1126。 2&#xff1a;MIPI CSI-2信号LANE&#xff0c;共5对。图像分辨率1920*1080&#xff0c;格式YUV422 8Bit&#xff0c…

整理了上千个 Python 工具库,涵盖24个大方向

Python 生态&#xff0c;向来以各种类库齐全而闻名&#xff0c;这也是这门语言如此受欢迎的重要原因。 今天就给大家分享一下这几天的战果&#xff0c;宵衣旰食&#xff0c;不眠不休的整理了近千个 Python 库&#xff0c;梳理不易啊&#xff0c;收藏的同时&#xff0c;记得点赞…

数据可视化之seaborn绘图

记录一个今天画出来的数据统计图(绝美&#xff0c;当然数据是癌症相关的就不是很美了, 之前一直都用plt.plot&#xff0c;也不太会用 但是现在发现seaborn真的可以 palette sns.color_palette("ocean", 2) sns.kdeplot(datacancer_data,xRadius (worst),shadeTrue…

ext4 extent详解2之内核源码详解

在查看本文前&#xff0c;希望先查看《ext4 extent详解1之示意图演示》这篇文章&#xff0c;有助于理解本文。本文内核源码版本3.10.96&#xff0c;详细内核详细源码注释见https://github.com/dongzhiyan-stack/kernel-code-comment。 什么时候会用到ext4 extent B树呢&#xf…

SQL SERVER 2016安装部署

1&#xff1a;运行SETUP开始安装SQL SERVER 2016。 2&#xff1a;在计划中可以查看支持SQL SERVER 2016安装的软硬件条件等信息。 3&#xff1a;在左侧安装中选择全新SQL Server独立安装或向现有安装添加功能。 4&#xff1a;可以安装指定的版本&#xff0c;Evaluation这个需要…

圣诞节制作一颗HTML的圣诞树吧

目录 前言&#xff1a; 一、vscode里面运行 二、记事本txt保存运行 前言&#xff1a; 来到圣诞节了&#xff0c;那么就可以制作一颗HTML的圣诞树送给朋友&#xff0c;没有编程基础的小白也可以按照步骤操作也可以运行起来代码的 一、vscode里面运行 1.打开vscoede&#x…

Cadence每日一学_13 | 使用 Allegro 制作PCB封装(以STM32为例)

文章目录一、数据手册分析二、新建封装文件Step1. 新建Package SymbolStep2. 设置设计参数Step3. 设置焊盘路径三、放置焊盘四、绘制Place Bound Top五、绘制装配层六、绘制丝印1. 添加芯片边框丝印2. 添加1脚标识3. 添加芯片位号标识一、数据手册分析 焊盘长度&#xff1a;理论…

Github高效搜索方式

Github高效搜索方式 文章目录Github高效搜索方式0、写在前面1、常用的搜索功能1.1 直接搜索1.2 寻找指定用户|大小的仓库1.3 搜索仓库1.4 查找特定star范围的仓库1.5 查找指定主题1.6 查找仓库语言1.7 搜索issue和pull请求2、 傻瓜式搜索3、参考0、写在前面 名词解释 watch&…

【机器学习】深入理解LightGBM

目录&#xff1a;深入理解LightGBM一、LightGBM简介二、LightGBM提出的动机三、 XGBoost的缺点及LightGBM的优化3.1 XGBoost的缺点3.2 LightGBM的优化四、 LightGBM的基本原理4.1 基于Histogram的决策树算法4.1.1 直方图算法4.1.2 直方图做差加速4.2 带深度限制的 Leaf-wise 算…

把连续学习的思路用在基于图像的相机定位问题中( ICCV 2021)

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 点击进入—>3D视觉工坊学习交流群 Continual Learning for Image-Based Camera Localization(2021 ICCV顶会文章) 代码地址:https://github.com/AaltoVision/CL_HSCNet 主要内容: 论文探讨了将连续学习用在视觉定…

Nexus迁移到阿里云效packages

点击右上角sign in登录按钮&#xff0c;登录到nexus中 登录后&#xff0c;会出现设置按钮&#xff0c;如图 点击设置按钮&#xff0c;点击左侧的system&#xff0c;点击API&#xff0c;即可打开restFul接口界面 点击打开 Components 组&#xff0c;找到 /v1/components 接…

【cmake】利用ExternalProject_Add解决第三方库target命名冲突问题

参考 cmake菜谱第八章第一节 我们经常会遇到这种情况&#xff1a; project A 是最外层项目 project B 是A使用的外部库 project C 是A和B使用的外部库 . ├── extern │ ├── B │ │ ├── extern │ │ │ └── C │ │ └── src │ └── C …