关于洛谷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,刚好记录有多少字符串经过这个前缀。
- find 查询函数
遍历查询串每一位字符:
- 遇到不存在的子节点,说明这个前缀不存在,直接返回 0
- 正常走到查询串末尾对应的节点
- 返回
cnt[u],就是有多少字符串拥有这个前缀
- main 主函数逻辑(多组数据)
- 多组测试用例,每组开始前清空字典树:循环把已经用过的节点
a[j][k]置 0,cnt[j]置 0,重置idx=0 - 读入 x 个字符串,全部插入字典树
- 读入 y 个字符串,逐个查询并输出结果
代码如下:
![image]()
![image]()


浙公网安备 33010602011771号