Trie:字典树
简介
\(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串。
作用
把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个句子的前缀为例)。
实现
\(Trie\)是一个有根树,它必有一个根节点(我们可以把根节点记作\(0\)),每一条边都有一个字符权值(也可以取这个字符的\(ID\)来当做权值),而节点上存储的则是该节点的单词数目。
我们可以用\(son[i][j]\)来表示第\(i\)个节点编号为\(j\)的儿子,并用\(w[i]\)存储第\(i\)个节点的单词数目,这样就可以构造出一个\(Trie\)了。
构造一个\(Trie\)的时间复杂度是\(O(∑字符串长度)\),询问时间则为\(O(最大字符串长度)\),不过在实际情况中,复杂度也可能会有所减少。
可以说,\(Trie\)的效率是比较高的。
模板
//题意:输入一个数n,随后读入n个单词s[1]...s[n],然后读入一个数m,随后读入m个句子t[1]...t[m],对于每一个句子t[i],求出有多少个单词是它的前缀
//本代码默认只有小写字母
#include<bits/stdc++.h>
#define N 1000//字符串最大个数
#define L 100//字符串最大长度
#define C 26//字符总数
using namespace std;
int n,m;
struct Trie
{
int len,son[N*L+5][C],w[N*L+5];//len存储的节点个数,son[]数组用于储存每个节点的子节点,w[]数组存储每个节点的单词数目
int getID(char x) {return x-'a';}//获取这个字符的ID
void Insert(string s) //将字符串s插入Trie
{
int Now=0;
for(int i=0;i<s.length();i++)
{
if(son[Now][getID(s[i])]==0) son[Now][getID(s[i])]=++len;//若当前字符没出现过,就将其加入当前节点的子节点
Now=son[Now][getID(s[i])];//继续往下进行操作
}
w[Now]++;//最终的Now就是单词节点,将这个节点单词数加1
}
int get_pre(string s)//查找字符串s的前缀个数
{
int Now=0,res=0;//res统计结果
for(int i=0;i<s.length();i++)
{
res+=w[Now];//加上当前节点的单词数
if(son[Now][getID(s[i])]!=0) Now=son[Now][getID(s[i])];//继续往下进行操作
else return res;//若当前字符不是当前节点的子节点,就返回结果
}
return res+w[Now];
}
}t;
int main()
{
string x;
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>x,t.Insert(x);
scanf("%d",&m);
for(int i=1;i<=m;i++) cin>>x,printf("%d\n",t.get_pre(x));
return 0;
}
Trie:字典树的更多相关文章
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- Trie字典树 动态内存
Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 标准Trie字典树学习二:Java实现方式之一
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...
- 817E. Choosing The Commander trie字典树
LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...
- C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- 数据结构 -- Trie字典树
简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质: 1. 根节 ...
- 踹树(Trie 字典树)
Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- Trie字典树 静态内存
静态字典树 看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来... 专心一点就不会这样了.... 接下来就去刷刷字典树的题吧....... 下面是字典树.... 定义节点 typedef s ...
随机推荐
- [Xcode 实际操作]四、常用控件-(9)普通警告窗口的使用
目录:[Swift]Xcode实际操作 本文将演示警告窗口的使用方法. 警告窗口不仅可以给用户展现提示信息,还可以提供若干选项供用户选择. 在项目导航区,打开视图控制器的代码文件[ViewContro ...
- web综合案例03
web综合案例03 web综合案例03 web综合案例03 web综合案例03 ... 待复习
- 如何使用JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- webpack配置apihost
webpack配置全局apihost可以解决在不同环境(开发环境及生产环境)中域名,端口号会改变的问题.如: 解决办法: 一行代码: axios.defaults.baseURL = 'http:// ...
- Java中keytool管理证书
1.创建证书库以及第一个证书 keytool -genkeypair -alias "wangpass" -keyalg "RSA" -keystore &qu ...
- 【ACM】取石子 - 博弈论
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游 ...
- Win10创建还原点
Win + E打开任务管理器 右击此电脑,选择属性 单击高级系统设置 选择系统保护 单击系统还原 按照提示操作,OK.
- Hive 基本语法操练(五):Hive 的 JOIN 用法
Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...
- Maven的学习资料收集--(四)使用Maven构建Web项目-测试
2014-08-04 23:21 2人阅读 评论(0) 收藏 编辑 删除 目录(?)[+] [-] 在srcmainjava下新建一个Servlet 修改webxml 新建JSP 测试 在 ...
- C 碎片九 预处理&位运算&文件操作
一.预处理 预处理语句:#开头的语句,在预处理阶段处理预处理语句.包括宏定义.文件包含处理.条件编译 1, 宏定义 1. 不带参数宏定义:#define 标识符 字符串 #define PI 3.1 ...