字典树(Trie)学习笔记
什么是字典树

上图来自luogu题解
这是一种字典树,不过本文讲的不是这种图,本文要讲一种更通俗易懂的(博主个人观点)
我要讲的是每个节点只存一个字母或数字,通过打标记的方法实现find的
像这样

上图来自百度百科
如何存储字典树
我不想写那些很难搞的指针,虽然用指针会使程序简单明了,可能以后会更新上指针版的吧,咕咕咕
个人认为存储字符串只需要按顺序就可以了,这应该也是字典树的精髓
如要顺序存储下面的字符串:"lyqalioi","orzliuzitong","zbqisredsun","orztzt".......
只需用tree[i][j]来表示以i为根的j号孩子的编号(仔细搞搞这里,比较难懂)
用flag[i]来表示以i号节点为结束的字符串有没有(前面的描述不太准确,就是到i号节点的字符串有没有)
然后就可以迭代根编号root了
void add(char *s)
{
int len=strlen(s),root=0/*root为根节点,初始化0*/,id/*id是编号用char-'a'表示*/;
for(int i=0;i<len;++i)
{
id=s[i]-'a';
if(!tree[root][id]) tree[root][id]=++sum;
root=tree[root][id];//更新根节点,之前在博客里写了
}
flag[root]=true;//更新标记
}
如何查找字符串有没有出现
如果彻底懂了上面这里就不用看了
这里就不解释了和上面一样
bool find(char *s)
{
int len=strlen(s),root=0/*root为根节点,初始化0*/,id/*id是编号用char-'a'表示*/;
for(int i=0;i<len;++i)
{
id=s[i]-'a';
if(!tree[root][id]) return false;
root=tree[root][id];
}
if(flag[root]==true) return true;//看有没有出现以root结束的字符串
else return false;
}
第一个图的那种线段树
代码比较复杂,不过效率比上文的高很多,所以本文也会讲解
应用
大多数字典树的题目都不会直接让你搞一棵树就完通常会带有一些附加条件,会在下面的例题中有涉及
例题
1.统计难题
就是统计了个sum[root]没什么好说的
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
#define int long long int
using namespace std;
inline int read() {
char c = getchar();
int x = 0, f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
const int MAXN=2e6+5;
int tree[MAXN][30],tot,sum[MAXN];
void add(char *s) {
int root=0,id,len=strlen(s);
for(int i=0; i<len; ++i) {
id=s[i]-'a';
if(!tree[root][id]) tree[root][id]=++tot;
sum[tree[root][id]]++;
root=tree[root][id];
}
}
int find(char *s) {
int root=0,id,len=strlen(s);
for(int i=0; i<len; ++i) {
id=s[i]-'a';
if(!tree[root][id]) return 0;
root=tree[root][id];
}
return sum[root];
}
char s[MAXN];
signed main() {
while(gets(s)) {
if(s[0]=='\0') break;
add(s);
}
while(scanf("%s",s)!=EOF) {
cout<<find(s)<<'\n';
}
return 0;
}
2.P2580 于是他错误的点名开始了
字典树(Trie)学习笔记的更多相关文章
- 字典树trie学习
字典树trie的思想就是利用节点来记录单词,这样重复的单词可以很快速统计,单词也可以快速的索引.缺点是内存消耗大 http://blog.csdn.net/chenleixing/article/de ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- 『字典树 trie』
字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...
- 字典树(Trie)详解
详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...
- Python的dict字典结构操作方法学习笔记
Python的dict字典结构操作方法学习笔记 这篇文章主要介绍了Python的dict字典结构操作方法学习笔记本,字典的操作是Python入门学习中的基础知识,需要的朋友可以参考下 一.字典的基本方 ...
- 字典树(Trie)的学习笔记
按照一本通往下学,学到吐血了... 例题1 字典树模板题吗. 先讲讲字典树: 给出代码(太简单了...)! #include<cstdio> #include<cstring> ...
- Trie字典树的学习及理解
字典树详解见此 我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容. Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入 ...
- 字典树 trie树 学习
一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种 二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
随机推荐
- http://blog.csdn.net/baidu_31657889/article/details/52315902
Java技术——你真的了解String类的intern()方法吗 转载 2016年08月25日 16:30:14 标签: java intern / intern / java 技术 6542 0.引 ...
- Linux学习笔记之rsync配置
0x00 rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. ...
- .net Dapper 实践系列(6) ---事务删除(Layui+Ajax+Dapper+MySQL)
目录 写在前面 实现步骤 写在最后 写在前面 上一小节,总结了事务多表更新的两种方法.一个是只更新原来的数据,一个是先删除原来的数据再往里面添加新的数据.而这一小节,说的是事务的多表删除. 实现步骤 ...
- C#MVC中ViewData和ViewBag的使用
ViewBag和ViewData的区别 ViewData ViewBag 它是key/value字典集合 它是dynamic类型对象 从asp.net mvc1就有了 从asp.netmvc3才有 基 ...
- IDEA超级实用的几个快捷键
最近开始使用IDEA,突然发现的比较的实用的几个快捷键 这些快捷键用的好的话真的可以提升很多效率 还有一些比较简单的快捷键,相信大家都会 Ctrl+X:剪切 Ctrl+C:复制 Ctrl+V:粘贴 C ...
- HDU2577 How to Type
题目链接 一道DP问题 定义dp[i][j]为敲完第i个字母的最小花费,j=1代表Caps Lock打开,j=0代表Caps Lock关闭,则有: 如果第i个字母为大写: dp[i][1]=min(d ...
- python基础05day--函数
一 函数知识体系 什么是函数?为什么要用函数?函数的分类:内置函数与自定义函数如何自定义函数 语法 定义有参数函数,及有参函数的应用场景 定义无参数函数,及无参函数的应用场景 定义空函数,及空函数的应 ...
- FPGA的电源选择重要性分析
米尔Z-Turn Board 7Z010(20)板卡体验有感:IF"> FPGA的电源需求通常很复杂,因为FPGA有多达至少三种供电要求,为了实现可靠的系统性能,必须对这些要求排序. ...
- MES实施可能会遇到的问题,这里都帮你解决
MES系统选型关键技术的发展已日趋成熟,开发MES系统技术并不是问题,困难的是如何确定系统的功能.规格,如何成功地使用MES系统,以充分发挥其作用,下面给大家分析这两大块内容. 实施MES系统选型的困 ...
- SpringBoot+Jpa+SpringSecurity+Redis+Vue的前后端分离开源系统
项目简介: eladmin基于 Spring Boot 2.1.0 . Jpa. Spring Security.redis.Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 ...