字典树代码模版(注释版)
作者:
拾心
,
2024-04-10 18:03:47
,
所有人可见
,
阅读 4
#include <iostream>
using namespace std;
const int N = 100010;
int son[N][26]; // 存储字典树的节点,son[i][j]表示节点i的第j个子节点的编号
int cnt[N]; // 末尾标记统计,cnt[i]表示以节点i结尾的字符串的出现次数
int idx; // 字典树节点的索引,用于分配新的节点编号
char str[N]; // 输入的字符串
int n; // 操作的次数
// 向字典树中插入字符串
void insert(char* str) {
int p = 0; // 根节点编号为0
for(int i = 0; str[i]; i++) { // 遍历字符串
int u = str[i] - 'a'; // 将字符映射为0-25的整数
if(!son[p][u]) son[p][u] = ++idx; // 如果当前节点的第u个子节点不存在,则创建新的节点
p = son[p][u]; // 移动到当前字符对应的子节点
}
cnt[p]++; // 统计以该节点结尾的字符串的出现次数
}
// 查询字符串在字典树中出现的次数
int query(char* str) {
int p = 0; // 根节点编号为0
for(int i = 0; str[i]; i++) { // 遍历字符串
int u = str[i] - 'a'; // 将字符映射为0-25的整数
if(!son[p][u]) return 0; // 如果当前节点的第u个子节点不存在,则说明字符串不存在于字典树中,直接返回0
p = son[p][u]; // 移动到当前字符对应的子节点
}
return cnt[p]; // 返回以该节点结尾的字符串的出现次数
}
int main() {
cin >> n; // 输入操作次数
while(n--) {
char op[2]; // 操作类型,I表示插入字符串,Q表示查询字符串
scanf("%s%s", op, str); // 输入操作类型和字符串
if(*op == 'I') // 如果是插入操作
insert(str); // 插入字符串到字典树中
else
cout << query(str) << endl; // 查询字符串在字典树中出现的次数并输出
}
return 0;
}