关于洛谷P8306的思路及题解

题目大意

给定多组测试数据,每组先给若干数字字符串插入字典树,再查询若干字符串,输出以该字符串为前缀的字符串数量。
代码核心思路:字典树(Trie)
数组定义
const int N=3000010;
int a[N][122]; // a[u][r]:字典树节点u,字符r对应的子节点编号
int cnt[N]; // cnt[u]:节点u被经过的次数,代表有多少串以到达u的字符串作为前缀
int idx=0; // 字典树节点编号,0是根节点
2. insert 插入函数
遍历字符串每一位字符:

  • 把字符转成数字r = c-'0'
  • 如果当前节点u没有r这个子节点,新建节点,idx++分配编号
  • 跳到子节点u=a[u][r]
  • 每走到一个节点,cnt[u]++

含义:每插入一个字符串,这条路径上所有节点计数 + 1,刚好记录有多少字符串经过这个前缀。

  1. find 查询函数
    遍历查询串每一位字符:
  • 遇到不存在的子节点,说明这个前缀不存在,直接返回 0
  • 正常走到查询串末尾对应的节点
  • 返回cnt[u],就是有多少字符串拥有这个前缀
  1. main 主函数逻辑(多组数据)
  • 多组测试用例,每组开始前清空字典树:循环把已经用过的节点a[j][k]置 0,cnt[j]置 0,重置idx=0
  • 读入 x 个字符串,全部插入字典树
  • 读入 y 个字符串,逐个查询并输出结果
    代码如下:
    image
    image
posted @ 2026-10-20 14:56  事事随风散  阅读(1)  评论(0)    收藏  举报