模板

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(字典)树模板的更多相关文章

  1. trie字典树模板浅析

    什么是trie? 百度百科 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的 ...

  2. [trie]字典树模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; struct trie{ int count; tri ...

  3. CH 1601 - 前缀统计 - [字典树模板题]

    题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...

  4. hdu1521(字典树模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 中文题诶~ 思路: 字典树模板 代码1: 动态内存, 比较好理解一点, 不过速度略慢, ...

  5. Trie 字典树,hdu1251

    参考博客:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 字典树就是单词树,顺着一条路径到达终止结点就形成一个单词,该单词的前缀包含在这 ...

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

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

  7. Trie字典树 动态内存

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

  8. 算法导论:Trie字典树

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

  9. 字典树模板题(统计难题 HDU - 1251)

    https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...

  10. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

随机推荐

  1. 127. Word Ladder via java

    A classic BFS problem, that is, we use a Queue to store temporary solution and record the size of th ...

  2. 简易orm 主要是为了旧平台查询方便

    直接新建个文件即可 ExLogic.cs public class ExLogic { public static int Execute(string sqlCommand, string dbCo ...

  3. 廖雪峰JS知识点整理——快速入门

    基本语法 1.每个语句以:结尾. 2.单行注释://... 3.多行注释:/*... ...*/ 数据类型和变量 运算 1.==自动转换数据类型在比较,不推荐使用 2.===不会转换数据类型,推荐使用 ...

  4. SQL-while begin end

    declare @i int set @i=1 while @i<=10000000begin insert into dbo.Persons (Age,Sex,Grade,Name) valu ...

  5. kali 下安装tplmap

    kali 下安装tplmap 1. 安装kali下的python2的pip工具 kali2020版及以上, 输入python2命令会执行python2, python3也存在. 但pip默认是pip3 ...

  6. CF527D 题解

    题意:数轴上有 \(n\) 个点,第 \(i\) 个点的坐标为 \(x_i\),权值为 \(w_i\).两个点 \(i,j\) 之间存在一条边当且仅当 \(abs(x_i-x_j)\geq w_i+w ...

  7. Jmeter-接口测试(一)

    一.接口测试分类 内部接口 外部接口--被测系统调用外部     --系统对外部提供的接口 接口测试重点:接口参数传递的正确性.接口功能的正确性.输出结果正确性.各种异常容错处理.权限控制.分页.调用 ...

  8. Python笔记(5)——if 语句一:条件测试(Python编程:从入门到实践)

    每条if语句的核心都是一个值为True或False的表达式.Python根据条件测试的值为True还是False来决定是否执行if语句中的代码.如果条件测试的值为True,Python就执行紧跟在if ...

  9. oracle 将以逗号分隔的列拆成多行的的方法

    原表如下 select * from hs_acct.custattach a where a.client_id='888827395'; 将列拆分成多行的语句 select * from ( -- ...

  10. drf视图类

    1 2个视图基类 # django 内置的View# drf 的APIView ,继承自View# GenericAPIView -两个重要的类属性:    queryset = Book.objec ...