Trie

news/2024/12/22 0:06:11/文章来源:https://www.cnblogs.com/mznq/p/18448743

835. Trie字符串统计

模板题:

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

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

共有 N 个操作,所有输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N 行,每行包含一个操作指令,指令为 I xQ x 中的一种。

输出格式

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

每个结果占一行。

数据范围

1≤N≤2∗10^4

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

1
0
1

个人理解

个人感觉这个Trie是比较简单理解的,直接给上注意点还有图解;

AC代码:

#include <iostream>
using namespace std;
//定义:不超过 10^5;
//符合要求即可;
const int Ma=100010;
//这里的26是a~z(字符串仅包含小写英文字母)
//con[Ma]是记录Trie每个父节点最后一个的子节点(有图解);
//idx是记录c的“下标”;
int Trie[Ma][26],con[Ma],idx;   //这里容易误解的点:26 a~z并不是层级;而是以a~z带头的父节点;
char str[Ma];
//这是构造Trie树;
void insert(char str[]){int p=0;for(int i=0;str[i];i++){int c=str[i]-'a';//如果没有记录这个字符,idx开辟一个位置来兜住;if(!Trie[p][c]){Trie[p][c]=++idx;}//p来指向下一个;p=Trie[p][c];}//记录最后一个字符的位置的个数; 比如 abcd 记录一次,abcd 再来一次 con[p]=2;con[p]++;
}
//查找
int search(char str[]){int p=0;for(int i=0;str[i];i++){int c=str[i]-'a';//按顺序找下去,不对直接返回0;if(!Trie[p][c]){return 0;}else{//指向下一个;p=Trie[p][c];}}//返回结果;return con[p];
}
int main(){int n;cin >> n;while(n--){char c;cin >> c >> str;if(c=='I'){insert(str);}else{cout << search(str) << endl;}}return 0;
}

图解:来源--------AC 四谷夕雨

Trie2.PNG

解疑:

Trie[p][c]=++idx; //这是什么?idx干什么用的?    
  • 一维下标:父节点的位置
    二维下标:当前节点的位置(az->025)
    值:当前节点的id(用idx标识,唯一性)
  • 这里是可以自己图画手推的:手推也可能就会发现用这种方法的话,是会浪费一层里的空间的.......这就自定义想了,在下面我会给出一些例题,是很明显的吧,有优化可以q我
  • 自己手推很重要,本人在没手推之前,总是觉得字符之间会重复什么的.......,手推才意识到idx的强大,idx是即将待操作的结点下标 (看自己的理解吧);
  • 哦对,在这以前要知道怎么构建Trie,要不然够呛,比如abcd 的“路径”是可以保存 abc的只需记录最后一个节点;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808786.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#2024-2025-1学号20241309《计算机基础与程序设计》第二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第二周作业这个作业的目标作业正文 2024-2025-1学号20241309《计算机基础与程序设计》第二周学习总结教材学习内容总结 《计算机科学概论》第一章 1.计算系统…

Ubuntu20.04安装LabelImg 以及出现(ModuleNotFoundError: No module named libs.resources)错误

安装 Ubuntu系统安装labelImg: sudo apt install pyqt5-dev-tools接下来,通过 GitHub 下载 LabelImg: git clone https://github.com/tzutalin/labelImg.git cd labelimg-master cd requirements/ sudo pip3 install -r requirements-linux-python3.txt -i https://pypi.tun…

shctf 有感

当我打ezapk的时候 见到了这个代码我看的出这是先进行key异或加密后再转base64和目标对比(其实我漏了一个要先转UTF-8,但是我只会用C语言写base64解码,不会UTF-8解码),百思不得其解怎么写shellcode,听了某大跌建议,直接咨询AI,然后被喂了个python代码,ctrlc+ctrlcv就解…

三千字长文:我知道的输入法技巧都在这了

这些技巧能让你打字更快、更好。这些技巧能让你打字更快、更好。 ‍ 官方设置 目前市面上有很多输入法软件,其中很多功能都是共有的,因为都是基础功能。因此,当选择了一款输入法好,可以先打开设置页面,好好地了解有什么功能。 此外,还可以看输入法官网文档,例如搜狗输入…

通过图片中信息得出地点

图片中会隐藏信息,比如右下角的小票将它翻转,可以看到 erbang Alaf Restaurant,Bangunan,Jalan SS21/39,Selang,这些字眼,于是直接用浏览器搜索 Gerbang正好填补了没看到的缺角, 地址上的Bangunan,Jalan SS21/39符合小票上的字,说明这就是图中的餐厅 作者想说,当要发布照…

实验1:UML与面向对象程序设计原则

[实验任务一]:UML复习 阅读教材第一章复习UML,回答下述问题: 面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。 1、关联关系2、聚合关系3、依赖关系4、组合关系[实验任务二]:单一职责原则 登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单…

图片地点

图片中会隐藏信息,比如右下角的小票将它翻转,可以看到 erbang Alaf Restaurant,Bangunan,Jalan SS21/39,Selang,这些字眼,于是直接用浏览器搜索 Gerbang正好填补了没看到的缺角, 地址上的Bangunan,Jalan SS21/39符合小票上的字,说明这就是图中的餐厅 作者想说,当要发布照…

等保2.0理解

等级保护(分等级保护,分等级监管):对信息系统分等级实行安全保护 对安全产品分等级管理 对安全事件分等级响应,处置动作:定级,备案,建设整改,等级测评,监督检查 风险评估,安全监测,通报预警,案事件调查,数据防护,自主可控,供应链安全,效果评价,综合考核,等等…

P10418 [蓝桥杯 2023 国 A] 相连的边 题解

一个比较有趣的树形 DP,情况比较多。 【题目简述】 给定一棵树,求三条相连的边,其边权之和最大。 【思路】 以 X 代表当前节点,S 表示儿子,G 表示孙子,P 表示父节点。首先把树建出来,在以下图中,我们模拟二号点的 DP 过程,考虑以下几种情况:有一条边指向父节点时FG(…

订单交易平台三(登录界面整个实现过程)阶段一(只实现简单的登录功能)

1.在视图函数account进行写代码逻辑(需要了解django中form组件的知识、md5码加密、脚本的编写) 1.1 登录界面后端的编写 """ 在account.py文件 """from django.shortcuts import render, redirect from web import modelsfrom utils.encrypt …

订单交易平台二(写代码之前的准备工作)

订单交易平台准备工作 1.先搭建环境 # 1.先创建python基本环境,并且创建虚拟环境# 2.创建完成后,先安装你所需要的Django版本: pip install Django==3.2# 3.创建Django项目: django-admin startproject app01 .# 4.创建Django,在app01根目录文件下创建apps文件,里面放app文…