AcWing 835. Trie字符串统计

Problem: AcWing 835. Trie字符串统计

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个使用Trie树(字典树)解决的问题。Trie树是一种用于快速查询、插入和删除字符串的数据结构。在这个问题中,我们需要处理四种操作:插入字符串、查询字符串、查询前缀和删除字符串。这四种操作都可以通过Trie树来实现。

解题方法

插入字符串:

从根节点开始,按照字符串的每个字符,依次在Trie树中插入节点。同时,我们需要记录每个节点的pass和end值。pass表示有多少字符串经过这个节点,end表示有多少字符串以这个节点结束。

查询字符串:

从根节点开始,按照字符串的每个字符,依次在Trie树中查找节点。如果所有字符都找到对应的节点,并且最后一个字符对应的节点的end值大于0,那么说明这个字符串存在。

查询前缀:

从根节点开始,按照前缀的每个字符,依次在Trie树中查找节点。如果所有字符都找到对应的节点,那么最后一个字符对应的节点的pass值就是以这个前缀开头的字符串数量。

删除字符串:

首先,我们需要查询这个字符串是否存在。如果存在,那么我们就从根节点开始,按照字符串的每个字符,依次在Trie树中删除节点。删除节点时,我们需要更新pass和end值。

复杂度

时间复杂度:

对于每个操作,我们最多需要遍历字符串的所有字符,所以时间复杂度是 O ( n ) O(n) O(n),其中 n n n是字符串的长度。

空间复杂度:

我们需要存储所有的字符串,所以空间复杂度是 O ( m ) O(m) O(m),其中m是所有字符串的总长度。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static int MAXN = (int) (2e5 + 10);static int[][] tree = new int[MAXN][60];static int[] pass = new int[MAXN];static int[] end = new int[MAXN];static int cnt = 1;static int n;public static void main(String[] args) throws NumberFormatException, IOException {clear();n = Integer.parseInt(in.readLine());while(n-- > 0) {String[] s = in.readLine().split(" ");if(s[0].equals("I")) {insert(s[1]);} else if(s[0].equals("Q")) {out.println(search(s[1]));}}out.flush();}private static void insert(String word) {int cur = 1;pass[cur]++;for (int i = 0, path; i < word.length(); i++) {path = word.charAt(i) - 'a';if (tree[cur][path] == 0) {tree[cur][path] = ++cnt;}cur = tree[cur][path];pass[cur]++;}end[cur]++;}private static int search(String word) {int cur = 1;for (int i = 0, path; i < word.length(); i++) {path = word.charAt(i) - 'a';if (tree[cur][path] == 0) {return 0;}cur = tree[cur][path];}return end[cur];}private static int prefixNumber(String pre) {int cur = 1;for (int i = 0, path; i < pre.length(); i++) {path = pre.charAt(i) - 'a';if (tree[cur][path] == 0) {return 0;}cur = tree[cur][path];}return pass[cur];}private static void delete(String word) {if (search(word) > 0) {int cur = 1;for (int i = 0, path; i < word.length(); i++) {path = word.charAt(i) - 'a';if (--pass[tree[cur][path]] == 0) {tree[cur][path] = 0;return;}cur = tree[cur][path];}end[cur]--;}}private static void clear() {// TODO Auto-generated method stubfor (int i = 0; i <= cnt; i++) {Arrays.fill(tree[i], 0);pass[i] = 0;end[i] = 0;}}}

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

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

相关文章

【Android】重温Activity生命周期

前言 Android中用得最多的组件是Activity&#xff0c;而它的生命周期也是最基础的知识&#xff0c;从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期&#xff1a;onCreate、onStart、onResume、onPause、onStop、onDestory&…

Linux --- 高级IO

目录 1. 什么是IO 2. 阻塞的本质 3. 五种IO模型 3.1. 通过故事认识五种IO模型 3.2. 上述故事的总结 3.3. 具体的五种IO模型 3.3.1. 阻塞IO 3.3.2. 非阻塞轮询式IO 3.3.3. 信号驱动IO 3.3.4. 多路转接IO 3.3.5. 异步IO 4. 非阻塞IO 4.1. fcntl 系统调用 1. 什么是I…

【前端】项目碰到的面试题整理

一、目录 js 中一个 、、 的区别 ?..es6 语法中将两个对象合并成一个对象&#xff0c;使用什么语法&#xff1f;…let、const、var 有什么区别&#xff1f;…jquery 中如何获取当前元素下一个同级元素&#xff1f;…JS 中的深拷贝与浅拷贝的区别&#xff1f;…如何在 JS 中编…

抖店如何打造一款爆品?按照这三个阶段做,爆单很简单

大家好&#xff0c;我是电商笨笨熊 做抖音小店不懂得怎么选品&#xff0c;那还怎么出销量&#xff1f; 选品时很多新手最苦恼的问题&#xff0c;不知道从哪里选品更容易选中爆品、不懂得什么样的品才是爆品&#xff0c;更不懂得如何打造一款爆品。 那么今天&#xff0c;我们…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见&#xff0c;但在某些情况下可以进行操作的用户。在内网渗透过程中&#xff0c;当我们拿到shell时&#xff0c;肯定…

TypeScript 基础语法

文章目录 1. 类型注解2. 接口&#xff08;Interfaces&#xff09;3. 类&#xff08;Classes&#xff09;4. 泛型&#xff08;Generics&#xff09;5. 枚举&#xff08;Enums&#xff09;6. 高级类型7. 模块8. 装饰器&#xff08;Decorators&#xff09;9. 映射类型&#xff08;…

android11 如何修改状态栏的背景

修改status_bar.xml &#xff1a; <LinearLayout android:id"id/status_bar_contents"android:background"#1ABC9C"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingStart"dimen/statu…

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天&#xff0c;新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首&#xff0c;成功超越了此前领先的Claude 3 Opus。另外&#xff0c;新模型在处理长达64k的上下文时&#xff0c;性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…

Nginx服务 重写功能与反向代理

六、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;用于实现URL的…

DBA面试总结(Mysql篇)

一、delete与trancate的区别 相同点 1.两者都是删除表中的数据&#xff0c;不删除表结构 不同点 1.delete支持按条件删除&#xff0c;TRUNCATE不支持。 2.delete 删除后自增列不会重置&#xff0c;而TRUNCATE会被重置。 3.delete是逐条删除&#xff08;速度较慢&#xff09…

[svelte]基础知识+反应性能力

来源&#xff1a;Svelte 中文文档 | Svelte 中文网 之前不是在学html&#xff0c;css嘛&#xff0c;JavaScript有点多&#xff0c;还没整理完&#xff0c;因为svelte紧急&#xff01;现在就需要了 svelte前提先对html&#xff0c;css&#xff0c;JavaScript有基本的了解 什么…

【linux编译报错】g++: error:elf_x86_64:没有那个文件或目录

背景 gcc版本已经是高版本了&#xff0c;9开头了&#xff0c;但是在IDE编译的时候报错&#xff1a; 但是记得自己没有配置过这种参数&#xff0c;只能一步步查了 解决方法 步骤1&#xff1a;先google看了下别人是否碰到该问题 找到一个解决方法说&#xff1a; 在Makefile中…

配置路由器实现互通

1.实验环境 实验用具包括两台路由器(或交换机)&#xff0c;一根双绞线缆&#xff0c;一台PC&#xff0c;一条Console 线缆。 2.需求描述 如图6.14 所示&#xff0c;将两台路由器的F0/0 接口相连&#xff0c;通过一台PC 连接设备的 Console 端口并配置P地址&#xff08;192.1…

如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

win11电脑驱动怎么更新,windows11更新驱动

驱动是指计算机里软件的程序,硬件的运作离不开驱动的支持,因为驱动就是使得硬件和电脑系统沟通的桥梁。既然驱动如此重要,那么不装肯定不行,如果有问题,也要及时地修复和更新。最近,有位win11用户,想要了解win11电脑驱动怎么更新?接下来,教程会带来两种更新win11驱动的…

短剧微视频小程序app系统开发搭建

开发搭建短剧微视频小程序app系统需要以下步骤&#xff1a; 1. 确定需求和功能&#xff1a;根据用户需求和目标&#xff0c;确定小程序需要实现的功能和界面设计。 2. 设计小程序界面&#xff1a;根据需求和功能设计小程序界面&#xff0c;包括首页、发现页、个人页等。 3. …

`extern` 关键字的用法cpp

extern 是 C 和 C 编程语言中的一个关键字&#xff0c;用于声明变量或函数是在其他地方定义的。这通常用于跨多个源文件共享全局变量或函数。extern 关键字告诉编译器这个变量或函数的实现在别的地方&#xff0c;因此在链接阶段需要查找并包含它。 跨源文件共享全局变量 在不…

LlamaIndex 组件 - Loading

文章目录 一、概览加载Transformations将所有内容放在一起抽象 二、文档/节点概览1、概念2、使用模式文件节点 三、定义和定制文档1、定义文档2、自定义文档2.1 元数据2.2 自定义id2.3 高级 - 元数据定制1&#xff09;自定义LLM元数据文本2&#xff09;自定义嵌入元数据文本3&a…

【数据结构与算法】最大公约数与最小公倍数

最大公因数&#xff08;英语&#xff1a;highest common factor&#xff0c;hcf&#xff09;也称最大公约数&#xff08;英语&#xff1a;greatest common divisor&#xff0c;gcd&#xff09;是数学词汇&#xff0c;指能够整除多个非零整数的最大正整数。例如8和12的最大公因数…