首页 > 其他分享 >字典Trie树

字典Trie树

时间:2024-09-23 14:52:28浏览次数:10  
标签:26 idx Trie son int str 节点 字典

题目描述

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N (1≤N≤2×10^4) 个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。
接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。
每个结果占一行。

输入样例

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例

1
0
1

注释版代码

//题目链接:http://47.110.135.197/problem.php?id=5994
#include<iostream>
using namespace std;
const int N=100010;
char str[N];//表示输入的字符串
int idx,son[N][26],cnt[N];
//idx表示创建的每一个新节点唯一标识,因此需要自增
//当son为空值时,我们需要创建新节点,随后将idx赋给他,表明他的唯一标识,有了idx他就不为0了,就说明有值了
//那为什么idx不能设为一个固定值呢,因为后期查询的时候需要把son的值传给p,这里需要区分开
//而且最后一个字符的idx还需要作为p这个节点给统计单词数量
//son[][26]是为了存放每个节点的子节点,二维数组开26是因为只有26个英语字母
//cnt[]表示以每个节点结尾的单词数量
void insert(char str[])
{
	int p=0;//将根节点定义为0
	for(int i=0;str[i];i++)
	{
		int u=str[i]-'a';//将输入的26个英文字母转化为0-25的数字
		if(!son[p][u]) son[p][u]=++idx;//如果当前根节点没有u这个子节点,那么创建子节点,并给他唯一的标识
		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()
{
	int n;
	cin>>n;
	char op;
	for(int i=0;i<n;i++)
	{
		cin>>op;
	    if(op=='I') cin>>str,insert(str);
	    else if(op=='Q') cin>>str,cout<<query(str)<<endl;
	}
	return 0;
}

标签:26,idx,Trie,son,int,str,节点,字典
From: https://blog.csdn.net/r2931887650/article/details/142458503

相关文章

  • 为何有时出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate
    出现“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”这样的错误,意味着PHP脚本运行时消耗的内存超过了PHP配置允许的最大内存限制。这个错误通常是因为PHP脚本处理的数据量过大、内存消耗较高的任务或配置不当引起的。以下是几种解决......
  • BZOJ 4545 DQS 的 trie 题解
    Statement维护一棵树,边权\(\in\{\texttta,\textttb,\textttc\}\),根为\(1\),定义这棵树的子串为从\(1\)走到所有点构成的字符串的所有后缀,需要支持以下操作:问当前树的本质不同子串数给一个点添加一棵子树问一个串在当前树中作为子串的出现次数Solution直接广义SAM+......
  • Anthropic介绍Contextual Retrieval
    人工智能模型要想在特定环境中发挥作用,往往需要获取背景知识。例如,客户支持聊天机器人需要了解具体的业务,而法律分析机器人则需要了解大量的过往案例。开发人员通常使用检索增强生成(RAG)来增强人工智能模型的知识。RAG是一种从知识库中检索相关信息并将其附加到用户提示......
  • python字典
    字典dict字典的字符类型<class'dict'>字典表达符:{}1、字典(dict)是一种可变容器模型,且可存储任意类型对象2、字典的每个键,值key,value键值对形式3、键值用:分割,每个键值对之间用逗号分隔4、整个字典用{}包含5、字典键唯一,值不是唯一的d={'name':'hz','age':18}print(ty......
  • 【Python系列】字典判断空
    ......
  • Redis 字典的哈希函数和 rehash 操作详解
    Redis字典的哈希函数和rehash操作详解在Redis中,字典(HashTable)是一种重要的数据结构,用于存储键值对。下面解释Redis字典的哈希函数和rehash操作。一、哈希函数作用Redis的字典使用哈希函数将键转换为一个整数索引,这个索引用于确定键值对在哈希表中的存储位......
  • Python字典:解锁数据处理的新维度
    引言在日常的软件开发过程中,我们常常遇到需要快速查找、更新或删除大量数据的需求。传统数组虽然使用广泛,但在某些场景下效率较低。此时,字典就展现了它无可比拟的优势——O(1)的时间复杂度让数据访问变得极为高效。更重要的是,通过灵活运用字典的高级特性,如嵌套字典、字典推导式等,......
  • day06 数据类型:指针、切片、字典
    day06数据类型Go语言中常见的数据类型有很多,例如:整型,用于表示整数。浮点型,用于表示小数。布尔型,用于表示真/假。字符串,用于表示文本信息。数组,用于表示多个数据(数据集合)指针,用于表示内存地址的类型。切片,用于表示多个数据(数据集合)字典,用于表示键值对结合。结构体,用于......
  • MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
    原文:MySQL8.0PublicKeyRetrievalisnotallowed错误的解决方法参考:ConnectionJava-MySQL:PublicKeyRetrievalisnotallowed在使用MySQL8.0时重启应用后提示com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:PublicKeyRetrievalis......
  • 【Python学习笔记】 第8章 列表与字典
    列表Python的列表是:任意对象的有序集合通过偏移访问可变长度、异构以及任意嵌套属于“可变序列”的分类对象引用数组下表是常见/具有代表性的列表对象操作:操作解释L=[]一个空的列表L=[123,'abc',1.23,{}]有四个项的列表,索引从0到3L=......