今天上午省选字符串......只会KMP、连hash都不会的我被大佬虐惨了......于是我要发奋图强学习字符串,学习字符串当然就要从Trie树这种可爱的数据结构开始啦!!!

一、什么是Trie树???

字典树,顾名思义,用来保存一些字符串。

二、Trie树的优势/用途???

那么就有人会问了:保存一些字符串,为什么不直接用数组???答案是显然的,你会收获MLE的好结果,于是我们考虑节省空间来保存他们的数据结构,于是Trie树就应运而生了!!!

三、核心思想???保存方法???

考虑存储两个单词ABA和ABC,我们可以利用他们有着共同前缀“AB”(因此Trie又被称为“前缀树”),于是我们可以建立一棵形如这样的Trie树:

A

|

   B

   |

————

 |    |

A        C

我们发现,我们用了四个字符的空间,就存了六个字符,再加上动态开点,使得Trie的空间复杂度十分优秀。

四、Trie常用操作

插入/查询 是Trie的最基本操作:

插入代码如下(有详细注释,查询与之相似)

 void insert(char *s)
{
int u=,len=strlen(s+);
//len为字符串长,u指向当前节点,最开始是根节点,指向0
for(int i=;i<=len;i++)
{
int c=idx(s[i]);//查询s[i]对应的数字
if(!ch[u][c])ch[u][c]=++cnt;//如果没有这个点,开一个新节点
u=ch[u][c];//顺着走一位
}
}

Trie插入

五、例题:

洛谷P2580

解析:

Trie树裸题,将所有学生的名字放进Trie树中。对于询问,如果一个人的名字中有的点为空,那么就是错的,如果是第一次查询,那么就是对的,否则就是重复了。

参考代码如下:

 // luogu-judger-enable-o2
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 500050
using namespace std;
struct Trie
{
int val[N],ch[N][],cnt;
int idx(char c){return c-'a';}
void insert(char *s)
{
int u=,len=strlen(s+);
for(int i=;i<=len;i++)
{
int c=idx(s[i]);
if(!ch[u][c])ch[u][c]=++cnt;
u=ch[u][c];
}
}
int search(char *s)
{
int u=,len=strlen(s+);
for(int i=;i<=len;i++)
{
int c=idx(s[i]);
if(!ch[u][c])return ;
u=ch[u][c];
}
if(!val[u]){val[u]=;return ;}
return ;
}
}trie;
int n,m;
char s[];
int main()
{
ios::sync_with_stdio();
cin>>n;
for(int i=;i<=n;i++)
{
cin>>(s+);
trie.insert(s);
}
cin>>m;
for(int i=;i<=m;i++)
{
cin>>(s+);
int res=trie.search(s);
if(res==)cout<<"WRONG"<<endl;
else if(res==)cout<<"OK"<<endl;
else cout<<"REPEAT"<<endl;
}
return ;
}

洛谷P2580

Trie字典树详解的更多相关文章

  1. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  2. Trie字典树的学习及理解

    字典树详解见此 我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容. Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入 ...

  3. Trie树详解(转)

    特别声明 本文只是一篇笔记类的文章,所以不存在什么抄袭之类的. 以下为我研究时参考过的链接(有很多,这里我只列出我记得的): Trie(字典树)的应用——查找联系人 trie树 Trie树:应用于统计 ...

  4. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  5. 数据结构图文解析之:AVL树详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  7. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  8. Python - 字典(dict) 详解 及 代码

    字典(dict) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17291329 字典(dict)是表示映射的数据 ...

  9. Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】

    转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...

随机推荐

  1. Django【第14篇】:Django之Form组件补充

    补充 一.定义的规则 class TeacherForm(Form): #必须继承Form # 创建字段,本质上是正则表达式 username = fields.CharField( required ...

  2. Keras MAE和MSE source code

    def mean_squared_error(y_true, y_pred): if not K.is_tensor(y_pred): y_pred = K.constant(y_pred) y_tr ...

  3. win10如何设置软件开机启动

    想要实现应用程序在所有的用户登录系统后都能自动启动,就把该应用程序的快捷方式放到“系统启动文件夹”里C:\ProgramData\Microsoft\Windows\Start Menu\Progra ...

  4. flask入门,Hello World!

    flask这个框架简单易用,去年2018的使用份额已经快接近django了.入门首选,没有太多的要求. 接下来,写个Hello World吧 1.新手入门,如果你是在windows下使用的,需要先安装 ...

  5. java基础拓展

    1. 作用域:public private protected 默认的区别 public:在同一项目中,被public修饰的在任何地方都可以被调用 private:被private修饰的,只能在本类中 ...

  6. 微信小程序-tabBar-注意事项

    tabBar.list[0].selectedIconPath 文件格式错误,仅支持 .png..jpg..jpeg 格式

  7. linux运维、架构之路-Kubernetes离线、二进制部署集群

    一.Kubernetes对应Docker的版本支持列表 Kubernetes 1.9 <--Docker 1.11.2 to 1.13.1 and 17.03.x Kubernetes 1.8 ...

  8. Bugku web web基础$_GET

    web基础$_GET 打开网站后发现 $what=$_GET['what']; echo $what; if($what=='flag') echo 'flag{****}'; 根据这段话的意思是将w ...

  9. 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )

    题目链接 题意 : 给出一副图,大连是起点,终点是西安,要求你求出从起点到终点且经过中转点上海的最小花费是多少? 分析 : 最短路是最小费用最大流的一个特例,所以有些包含中转限制或者经过点次数有限制的 ...

  10. js基础补漏

    1.for...in 和 for...of有何区别 for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称.一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性. ...