[AcWIng 835] Trie字符串统计
点击查看代码
#include<iostream>
using namespace std;
const int N = 6e5 + 10;
int son[N][26], cnt[N], idx;
char str[N];
void insert(char str[])
{
int p = 0;
for (int i = 0; str[i]; i ++) {
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++;
}
int query(char str[])
{
int p = 0;
for (int i = 0; str[i]; i ++) {
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}
int main()
{
int n;
cin >> n;
while (n --) {
char op;
cin >> op >> str;
if (op == 'I') insert(str);
else if (op == 'Q') cout << query(str) << endl;
}
return 0;
}
- 字典树适用于大小写字符串集合的插入和查询;
- 把字母 'a' - 'z' 用数字 '0' - '25' 进行表示;
- 使用数组来存储字典树,数组下标为 0 的结点既是根节点也是空节点;
- 字典树的存储使用一个数组来实现的,idx 代表的是第 idx 个被创建的节点,每当需要新节点时,idx ++;
- p 是一个指针,用来实现对树上节点的遍历,最后停止的位置是字符串的最后一个字符;
- son[ i ][ j ] 用来找到当前节点的孩子节点的位置,i 表示第 i 个节点,j 表示孩子节点的字符,son[ i ][ j ] 的值是下一个节点是第几个创建的节点,p = son[ i ][ j ] 的作用是让 p 指针指向孩子节点;
- cnt 用来记录以 p 位置字符作为结尾的字符出现的次数,因为字典树的性质,假设已经有了字符串 “abcd”,p 指向 "d" 的位置,那么只有再次出现 “abcd” 这个字符串时,cnt[ p ] 才会 ++(因为如果有不一样的字符,则会跑到其他分支,或者这个位置不是字符串结尾)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!