Trie详解
Trie,又名字典树、单词查找树,可以较高效地实现统计、排序和保存大量的字符串。
顾名思义,Trie是一个树状的结构,按照树型结构来存储字符串,显然是一种以空间换时间的方法。整体上理解和实现都不会很难。
下面是实现方法:
插入:
- 当我们往一棵Trie中插入一个字符串时,我们先定义一个指针p指向根节点,然后依次扫描字符串的元素,设其为s;
- 若s字符指向的是一个已存在的节点,设其为q,则令p=q;若s字符指向的一个是空节点,则新建一个节点,设其为q,并令p=q;
- 按照上面的步骤将字符串的元素扫描完毕后,将当前的p标记为一个字符串的末尾。
代码:
int p=0;
for(int i=0;i<s.size();i++)
{
if(!trie[p][s[i]-'a'])
trie[p][s[i]-'a']=++tot;//指向新节点
p=trie[p][s[i]-'a'];//取出指针
}
end[p]=true;
查找:
- 当我们要在一颗Trie中查找一个字符串是否存在时,我们先定义一个指针p指向根节点,然后依次扫描字符串的元素,设其为s;
- 若s字符指向的是一个空节点,则说明s没有被插入过这棵Trie;若s字符指向的是一个已存在的节点,设其为q,则令p=q;
- 按照上面的步骤将字符串的元素扫描完毕后,若当前的p为一个字符串的末尾,则该字符串存在于这棵Trie中;反之则不存在。
代码:
int p=0;
for(int i=0;i<s.size();i++)
{
p=trie[p][s[i]-'a'];//取出指针
if(!p)
return 0;
}
return end[p];
它大概长这样:(来自lyd的蓝书)

完整代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n,m,tot=1,trie[SIZE][26];//trie数组存的就是指针
bool end[SIZE];//SIZE表示所有字符串的长度之和
string s;
void add()
{
int p=0;
for(int i=0;i<s.size();i++)
{
if(!trie[p][s[i]-'a'])
trie[p][s[i]-'a']=++tot;
p=trie[p][s[i]-'a'];
}
end[p]=true;
}
int get()
{
int p=0;
for(int i=0;i<s.size();i++)
{
p=trie[p][s[i]-'a'];
if(!p)
return 0;
}
return end[p];
}
int main()
{
memset(end,false,sizeof(end));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
add();
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>s;
int ans=get();
if(ans)
cout<<"OK"<<endl;
else
cout<<"WRONG"<<endl;
}
return 0;
}
(注:以上代码中字符串默认为只由小写字母构成,有的部分要根据实际情况改变)
习题:
2019.3.21 于厦门外国语学校石狮分校
Trie详解的更多相关文章
- 字典树(Trie)详解
详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- trie树--详解
文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作.关键词:trie trie树 数据结 ...
- 转:trie树--详解
前几天学习了并查集和trie树,这里总结一下trie. 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串.判断前缀是否存在.查找字符串等基本操作:至于trie树的删除单个 ...
- [转] AC自动机详解
转载自:http://hi.baidu.com/nialv7/item/ce1ce015d44a6ba7feded52d AC自动机详解 AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文 ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
- HanLP中人名识别分析详解
HanLP中人名识别分析详解 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: l ·名字识别的问题 #387 l ·机 ...
- HanLP中的人名识别分析详解
在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: u u名字识别的问题 #387 u u机构名识别错误 u u关于层叠H ...
随机推荐
- 自制廉价的LED+LCD型投影仪
文档标识符:PROJECTOR_T-D-P6 作者:DLHC 最后修改日期:2020.7.30 本文链接:https://www.cnblogs.com/DLHC-TECH/p/PROJECTOR_T ...
- Python List list()方法
描述 list() 方法用于将元组转换为列表.高佣联盟 www.cgewang.com 注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中. 语法 list ...
- PHP constant() 函数
实例 返回一个常量的值: <?php//define a constantdefine("GREETING","Hello you! How are you tod ...
- [USACO09NOV]硬币的游戏 博弈 dp
LINK : coin game 这道题 超级经典去年这个时候我就看过题目了 但时至今日还不会/cy 觉得在做比赛的题目的时候少写省选的题目 多做水题多做不难也不简单的题目就好了. 由于我是真的不会博 ...
- vue_shop(基于vue电商管理后台网站)
vue_shop 目录 vue_shop day01 实现登录功能 项目预开发处理 Login.vue完整代码: 处理步骤: 添加element-ui的表单组件 添加第三方字体: 添加表单验证 导入a ...
- WEB应用中的路径问题及乱码问题
1 WEB应用中的路径问题 在web应用中,由于使用转发跳转路径时,地址栏不变.此时使用相对路径(../)存在404现象. 故使用绝对路径,解决web应用的路径问题. 什么是绝对路径,以 “/” 开 ...
- IDEA使用GsonFormat
安装GsonFormat插件 因为下载了最新版的idea2020.1.3发现GsonFormat在Idea商店不见了,所以去jetbrains官网下载jar包来安装插件https://plugins. ...
- Error: Cannot perform an interactive login from a non TTY device
zhangjiawen@zhangjiawen-PC MINGW64 /d/Docker Toolbox$ docker login --username=绝世随机变量 registry.cn-han ...
- C语言学习笔记之原码反码补码
原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0 0变1 补码:机器 ...
- C#LeetCode刷题之#682-棒球比赛(Baseball Game)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4028 访问. 你现在是棒球比赛记录员. 给定一个字符串列表,每个 ...