tire树

tire树又称字典树,是一种能够高效存储和查找字符串集合的数据结构。

图形如下图所示

每个节点表示一个字符串中的字符,从根节点到灰色节点的一条路径表示一个字符串(灰色节点表示是某个单词的结束字符,但不一定都是叶子节点)。这样,我们就可以通过遍历这棵树来检索是否存在待匹配的字符串了。

代码实现

用二维数组来抽象

//Trie树快速存储字符集合和快速查询字符集合
#include <iostream>using namespace std;const int N = 100010;
//son[][]存储子节点的位置,分支最多26条;
//cnt[]存储以某节点结尾的字符串个数(同时也起标记作用)
//idx表示当前要插入的节点是第几个,每创建一个节点值+1
int son[N][26], cnt[N], idx;
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];  //使“p指针”指向下一个节点}cnt[p]++;  //结束时的标记,也是记录以此节点结束的字符串个数
}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 m;cin >> m;while (m--){char op[2];scanf("%s%s", &op, &str);if (*op == 'I') insert(str);else printf("%d\n", query(str));}return 0;
}

并查集

下面我们来下一个知识,并查集,代码虽短,但是有思维

一般是以下用处:
1.将俩个集合合并
2.检查俩个元素是否在一个集合中

并查集在近乎O(1)的时间复杂度内,完成这俩个操作

基本原理:
用一棵树来表示一个集合,其树根就是集合的编号,每个节点存储它的父节点,p[x]即为他的父节点

判断树根if(p[x] == x
求集合编号while(p[x] != x) x = p[x];
合并俩个集合

1.暴力:将px直接插入到py中,或者将py直接插入到px中,将一个集合看作另一个集合的儿子,插入
2.优化:
找到一个根节点就全部插入,用专业的名词叫做路径压缩

#include<iostream>using namespace std;const int N=100010;
int p[N];//定义多个集合int find(int x)//加路径压缩
{if(p[x]!=x) p[x]=find(p[x]);/*经上述可以发现,每个集合中只有祖宗节点的p[x]值等于他自己,即:p[x]=x;*/return p[x];//找到了便返回祖宗节点的值
}int main()
{int n,m;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=='M') p[find(a)]=find(b);//集合合并操作elseif(find(a)==find(b))//如果祖宗节点一样,就输出yesprintf("Yes\n");elseprintf("No\n");}return 0;
}

tire树的存储和并查集相关推荐

  1. 数据结构之树的应用:并查集

    树的应用:并查集 并查集的概念: 三种基本操作: 例: 代码实现: 并查集的概念: 将所有的数据元素放在一个集合中,将集合分成若干个互不相交的子集,每一个子集对应一颗树,所有的自己组成森林. 三种基本 ...

  2. PAT甲级1021 Deepest Root :[C++题解]树的最大深度、并查集、dfs求树的深度

    文章目录 题目分析 题目链接 题目分析 分析: 考察知识点:并查集.dfs.树的深度 给定n个结点,n-1条边,只要能保证只有1个连通分量,就是一棵树.否则的话就不是树,它是不连通的. 用并查集来看是 ...

  3. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  4. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  5. 51nod1307(暴力树剖/二分dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  6. 【CF813F】Bipartite Checking(线段树分治+可删除并查集)

    文章目录 title solution code title You are given an undirected graph consisting of n vertices. Initially ...

  7. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  8. 可持久化线段树【主席树】可持久化并查集【主席树+并查集】

    笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...

  9. hdu 1271 小希的迷宫(树的性质,并查集)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

最新文章

  1. Android插件化原理解析——Hook机制之动态代理
  2. 主机和虚拟机ping不通的原因
  3. python中ipo模型有_python ipo模型是指什么?_后端开发
  4. 分割文本_PSENet、PANNet、DBNet三个文本检测算法异同
  5. Linux/Mac修改conda源,方便安装pytorch等
  6. mysql 主从 均衡_Mysql主从复制
  7. sd卡座封装尺寸_讯普电子SD卡座的引脚定义
  8. java反汇编_Java虚拟机学习总结(3)——JDK内置工具(jps、jstack、jmap、jstat)使用详解...
  9. g2(t)用matlab,数字信号处理实验报告
  10. localhost基本概念
  11. VB利用SHFileOperation实现拷贝、删除、重命名文件
  12. 大数据行业现在工作好不好找?很难吗?
  13. 如何高效学习,斯科特·扬(全文)
  14. Java中常见常用的类
  15. oracle 视图的写法,Oracle视图基础详解与实例
  16. art-illumina模拟测序
  17. 金融与量化分析 一; 金融 股票知识入门
  18. \t\t【团队精神】荣辱与共 交流分享 精诚协作 尊重理解 ——程序员应知
  19. 魔板 Magic Squares(bfs优化)
  20. .Net Core- Polly 的使用实践

热门文章

  1. web——CSS精灵图(背景图、定位背景图片background-position属性)
  2. ubuntu18.04为浏览器安装flash
  3. mysql共享锁 排它锁
  4. 考试如何用计算机,高会考试计算器长什么样?如何使用?一文说全了
  5. 最新案例 | 昇思MindSpore携手信大网御推出中原AI反诈骗创新解决方案,为全民反诈筑牢防火墙
  6. 达内android培训,达内Android培训—EGL 1.0 学习笔记
  7. Linux 下sz/rz(lsz/lrz)的使用
  8. JS实现点击按钮滑动
  9. Xcode无证书打ipa包
  10. 分布式事务系列三:Saga