Acwing835Trie字符串统计

题目

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

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

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

输入格式

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

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

输出格式

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

每个结果占一行。

数据范围

1≤N≤2∗10^4

输入样例:

css 复制代码
5
I abc
Q abc
Q ab
I ab
Q ab

输出样例:

复制代码
1
0
1

代码

java 复制代码
import java.util.Scanner;

public class Main {
    static int N = 100010, idx;
    static int[][] son = new int[N][26];  // 存储字母节点的二维数组,每个节点最多有 26 个子节点
    static int[] cnt = new int[N];  // 记录每个节点对应的单词数量

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();  // 输入操作次数
        while (n > 0) {
            n--;
            String command = in.next();  // 读取操作指令
            switch (command) {
                case "I":
                    String s = in.next();  // 读取待插入的字符串
                    insert(s);  // 调用插入函数
                    break;
                case "Q":
                    String st = in.next();  // 读取待查询的字符串
                    System.out.println(query(st));  // 输出查询结果
                    break;
            }
        }
    }

    // 查询函数,返回以字符串 st 为前缀的单词数量
    private static int query(String st) {
        int p = 0;  // 初始化根节点
        for (int i = 0; i < st.length(); i++) {
            char c = st.charAt(i);  // 获取字符串中的每个字符
            int u = c - 'a';  // 计算字符对应的索引
            if (son[p][u] == 0) son[p][u] = ++idx;  // 如果当前节点没有该子节点,则创建一个新节点
            p = son[p][u];  // 移动到下一个节点
        }
        return cnt[p];  // 返回以字符串 st 为前缀的单词数量
    }

    // 插入函数,将字符串 s 插入到字典树中
    private static void insert(String s) {
        int p = 0;  // 初始化根节点
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);  // 获取字符串中的每个字符
            int u = c - 'a';  // 计算字符对应的索引
            if (son[p][u] == 0) son[p][u] = ++idx;  // 如果当前节点没有该子节点,则创建一个新节点
            p = son[p][u];  // 移动到下一个节点
        }
        cnt[p]++;  // 更新以字符串 s 为前缀的单词数量
    }
}
相关推荐
武子康5 小时前
1.2GB 离线语音 Agent 真正值得复用的不是 908ms:四阶段职责 + 状态感知 Tool Schema + 可观测时间锚点
人工智能·后端·agent
掘金者阿豪5 小时前
那些年踩过的 MySQL 迁移坑,这次终于不用绕了
后端
用户7713970207065 小时前
深夜食堂:那个让我加班到凌晨的 ! 符号
后端
swipe5 小时前
03|Axios 请求进了后端之后:Controller、Request、Response 是怎么接住它的?
前端·后端·全栈
swipe5 小时前
02|从 `pnpm dev` 到 Spring Boot 启动:后端服务到底怎么跑起来?
前端·后端·全栈
网易云信5 小时前
网易智企Data Agent实践入选信通院《智能体创新实践案例汇编》
人工智能·后端·线下活动
swipe5 小时前
01|前端人第一次打开 Spring Boot 项目,应该先看哪里?
前端·后端·全栈
薛定谔的悦5 小时前
一次充电桩 Modbus TCP 采集模块的踩坑实录
后端
jvmind_dev5 小时前
1c1g 容器莫名 OOM Killed?排查 Metaspace 持续增长与脚本引擎的坑
java·后端
geovindu5 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法