Trie树,并查集的简单应用(AcWing)
创始人
2024-05-03 21:38:26
0

Trie树

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

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

现在对上述样例进行模拟

 Trie字符串统计

AC代码:

#include
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
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
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;
}

相关内容

热门资讯

微信安卓系统转苹果系统,轻松实... 你有没有想过,从微信安卓系统转到苹果系统,这中间的转换过程,就像是一场说走就走的旅行,充满了未知和惊...
如何刷安卓8.0系统,安卓8.... 你有没有想过,让你的安卓手机升级到最新的8.0系统,让它焕发出全新的活力呢?别急,今天我就来给你详细...
安卓系统里查看路由,安卓系统下... 你是不是也和我一样,对家里的无线网络充满了好奇?想知道安卓手机里怎么查看路由器信息?那就跟着我一起探...
手机出现安卓系统信号,手机信号... 你有没有发现,最近你的安卓手机信号好像变得特别不稳定呢?是不是觉得有时候信号满格,却还是接不到电话,...
创维安卓系统怎么安装,享受智能... 你家的创维电视是不是最近有点儿不给力,想要给它来个升级,让它焕发新生呢?那就得给它装个安卓系统啦!别...
中兴刷原生安卓系统,原生安卓系... 亲爱的读者们,你是否厌倦了那些千篇一律的安卓系统,想要给你的手机来点新鲜感?今天,就让我带你一起探索...
云系统与安卓系统软件,构建智能... 你有没有想过,你的手机里那些神奇的软件,其实都是靠云系统和安卓系统软件的默契配合才变得如此强大呢?想...
如何禁止安卓系统联网,全方位操... 你有没有想过,你的安卓手机其实是个小宇宙,里面藏着无数的秘密和信息?但是,你知道吗?有时候,这些信息...
a安卓系统不兼容,揭秘a设备的... 最近是不是发现你的安卓手机有些不对劲?比如,某个APP突然罢工了,再比如,你下载了一个新游戏,结果发...
安卓系统刷固件教程,解锁设备潜... 你有没有想过,你的安卓手机其实就像一个隐藏着无限可能的宝藏呢?没错,就是那个你每天不离手的宝贝。今天...
电脑系统安卓界面,功能与美学的... 你有没有发现,现在手机和电脑的界面越来越像了呢?没错,就是那个我们每天都要打交道的好伙伴——安卓界面...
吃鸡王座安卓系统,登顶吃鸡巅峰 你有没有想过,在手机游戏中,谁才是真正的“吃鸡王座”呢?今天,就让我带你一探究竟,看看安卓系统上的那...
安卓点名系统下载,安卓点名系统... 你有没有想过,在繁忙的学习生活中,有没有一种神奇的工具,能让你轻松管理课堂纪律,还能让点名变得如此有...
手机安装通用安卓系统,引领智能... 你有没有想过,为什么你的手机可以安装那么多好玩的应用?秘密就在于它搭载了通用安卓系统!想象一个系统就...
安卓系统仿真器,功能与操作指南 你有没有想过,在电脑上也能玩安卓游戏?没错,这就是安卓系统仿真器的神奇之处!想象你坐在电脑前,手握鼠...
安卓系统可以刷街机,畅享虚拟游... 你知道吗?现在用安卓系统刷街机,简直就像变魔术一样神奇!没错,就是那种让你仿佛穿越回童年,手握游戏杆...
安卓系统画画软件画笔,绘制无限... 你有没有发现,手机里的画画软件越来越丰富啦?尤其是安卓系统上的那些,简直让人眼花缭乱。今天,就让我带...
安卓系统垃圾和缓存,提升使用体... 手机里的安卓系统是不是越来越慢了?是不是觉得打开一个应用都要等半天?别急,今天就来跟你聊聊安卓系统里...
安卓系统图片转入苹果,轻松实现... 你是不是也有过这样的烦恼?手机里存了好多珍贵的照片,突然想换手机,却发现安卓系统的照片怎么也弄不到苹...
华为matebooke装安卓系... 你有没有想过,你的华为MateBook也能装上安卓系统呢?没错,就是那个我们平时手机上用的安卓系统!...