Trie(字典)树模板
模板
int son[N][26], cnt[N], idx;
// 0号点既是根节点,又是空节点
// son[][]存储树中每个节点的子节点
// cnt[]存储以每个节点结尾的单词数量
// 插入一个字符串
void insert(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++ ;
}
// 查询字符串出现的次数
int query(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}
一道例题

/**
* 本质上是一棵树,每个节点都有一个编号,每个节点的孩子节点可能是26个字母的其中之一
* son[i][j]: 父节点下某个孩子节点的编号(编号为i的节点下(ch-'a') == j的字母ch的编号),第一维表示当前点,第二位表示当前点的下一节点
* cnt[i]:以编号为i的节点为终点的字符串的个数
* 编号的规定:为0代表根节点或空节点
*/
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int son[N][26], cnt[N], idx;
char str[N];
void insert(char str[])
{
int p = 0;
for (int i = 0; str[i]; ++ i)
{
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx; // 如果p节点下映射值为u的孩子节点不存在,那么就添加一个点,编号为idx
p = son[p][u]; // 当前点指向父节点的下一个节点
}
++ cnt[p]; // 此时p指向的是字符串最后一个字符的节点编号
}
int query(char str[])
{
int p = 0;
for (int i = 0; str[i]; ++ i)
{
int u = str[i] - 'a';
if (!son[p][u]) return 0; // 在遍历字符串过程中发现某个字符是不存在的,所以说明当前这个字符串还未曾出现过
p = son[p][u]; // 开始找下一个字符
}
return cnt[p];
}
int main()
{
cin >> n;
while (n --)
{
char op;
cin >> op >> str;
if (op == 'I') insert(str);
else cout << query(str) << endl;
}
return 0;
}
Trie(字典)树模板的更多相关文章
- trie字典树模板浅析
什么是trie? 百度百科 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的 ...
- [trie]字典树模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct trie{ int count; tri ...
- CH 1601 - 前缀统计 - [字典树模板题]
题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...
- hdu1521(字典树模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 中文题诶~ 思路: 字典树模板 代码1: 动态内存, 比较好理解一点, 不过速度略慢, ...
- Trie 字典树,hdu1251
参考博客:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 字典树就是单词树,顺着一条路径到达终止结点就形成一个单词,该单词的前缀包含在这 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- Trie字典树 动态内存
Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 字典树模板题(统计难题 HDU - 1251)
https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...
- 标准Trie字典树学习二:Java实现方式之一
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...
随机推荐
- 书剑恩仇录<随笔>感想
书剑恩仇录是去年读完的,剧情上的细节处已经遗忘甚多,但本书也金庸先生的第一篇长篇武侠小说.此书的重要性不言而喻 摘要:故事的开头源于武当派陆菲青.因犯了杀人官司隐姓埋名为李沅芷的教书先生.因仇家寻上门 ...
- 3.17阿里Java后端,电商 sku 的全排列算法
3.17阿里Java后端 字典 有英文字典:Map<Character, String[]>,示例如下: a : [a, an] b : [bus, bird] c : [car, can ...
- python3 文件上传
1 # 文件上传方法 2 def upload_files(filepath, url, headers, data): 3 filename = filepath.split('\\')[-1] 4 ...
- 4、excel快速排序从1开始
在分世界杯的文件时,要求把每一行从1开始排列,自己的做法就是先输入1和2,然后拖黑1和2,接着鼠标一直往下拖,这样就了. 公式的方法: 输入公式=Row()-1,如何在这个单元格的右下角双击就可以了 ...
- 论MVC架构设计及其应用
论MVC架构设计及其应用 张紫诺1 (1. 位石家庄铁道大学,河北 石家庄 050000) 摘要:随着信息化建设的发展,人们愈发需要考虑采用一种良好的架构实现快速构建企业应用程序的目标.而MVC架构正 ...
- 图像处理|Matlab
图像处理 | Matlab 参考博文: 图像处理-平滑滤波 图像去噪-加性噪声(高斯/椒盐)
- Git本地仓库的文件夹不显示红色感叹号、绿色对号等图标
参考 https://blog.csdn.net/Elon15/article/details/125898375 主要是 在文件名前加8个空格(最少8个)!!!!
- Linux_Tomcat实战
Tomcat实战 tomcat简述 tomcat安装 部署jspgou项目 tomcat简述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(A ...
- 09 Hive安装与操作
一.安装Hive 下载解压重命名权限 配置环境变量 修改Hive配置文件 修改/usr/local/hive/conf下的hive-site.xml 1 2 3 4 5 6 7 8 9 10 11 1 ...
- requests模块获取cookie -----class 'requests.cookies.RequestsCookieJar'
#coding=utf-8 import requests url="http://www.baidu.com" response=requests.get(url) cookie ...