Trie字典树详解
今天上午省选字符串......只会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插入
五、例题:
解析:
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字典树详解的更多相关文章
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- Trie字典树的学习及理解
字典树详解见此 我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容. Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入 ...
- Trie树详解(转)
特别声明 本文只是一篇笔记类的文章,所以不存在什么抄袭之类的. 以下为我研究时参考过的链接(有很多,这里我只列出我记得的): Trie(字典树)的应用——查找联系人 trie树 Trie树:应用于统计 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- 数据结构图文解析之:AVL树详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- Trie字典树 动态内存
Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- Python - 字典(dict) 详解 及 代码
字典(dict) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17291329 字典(dict)是表示映射的数据 ...
- Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇)【转】
转自:https://blog.csdn.net/radianceblau/article/details/74722395 版权声明:本文为博主原创文章,未经博主允许不得转载.如本文对您有帮助,欢迎 ...
随机推荐
- 题解 P3166 【[CQOI2014]数三角形】
做完之后看了看题解,怎么一篇和我思路一样的也没有...我好慌啊qwq(所以一定是窝太弱了看不懂dalao的思路) 好吧窝的方法确实很奇怪: 核心代码只有3行 输入 循环 输出 一气呵成 是题解中的豪杰 ...
- vue-element添加修改密码弹窗
1.新建修改密码vue文件CgPwd.vue 代码如下: <template> <!-- 修改密码界面 --> <el-dialog :title="$t('c ...
- SPOJ-GSS1-Can you answer these queries 1
链接: https://vjudge.net/problem/SPOJ-GSS1 题意: You are given a sequence A[1], A[2], ..., A[N] . ( |A[i ...
- php array_shift()函数 语法
php array_shift()函数 语法 作用:删除数组中第一个元素,并返回被删除元素的值.富瑞联华 语法:array_shift(array) 参数: 参数 描述 array 必需.规定数组. ...
- C++ 对象间通讯机制 框架实现
// SignalSlot.h: interface for the CSignalSlot class. // /////////////////////////////////////////// ...
- AutoCAD2008换硬盘后重新激活
1.打开“C:\Documents and Settings\All Users\Application Data\Autodesk\Software Licenses”,删除文件夹里面的所有*.da ...
- Java 静态初始化块等的执行顺序
实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...
- 你的MySQL服务器开启SSL了吗?(转载)
最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...
- 一文读懂跨平台框架 Flutter 的搭建与运行
作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...
- 大数据笔记(十)——Shuffle与MapReduce编程案例(A)
一.什么是Shuffle yarn-site.xml文件配置的时候有这个参数:yarn.nodemanage.aux-services:mapreduce_shuffle 因为mapreduce程序运 ...