[AcWIng 835] Trie字符串统计

image
image


点击查看代码
#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;
}

  1. 字典树适用于大小写字符串集合的插入和查询;
  2. 把字母 'a' - 'z' 用数字 '0' - '25' 进行表示;
  3. 使用数组来存储字典树,数组下标为 0 的结点既是根节点也是空节点;
  4. 字典树的存储使用一个数组来实现的,idx 代表的是第 idx 个被创建的节点,每当需要新节点时,idx ++;
  5. p 是一个指针,用来实现对树上节点的遍历,最后停止的位置是字符串的最后一个字符;
  6. son[ i ][ j ] 用来找到当前节点的孩子节点的位置,i 表示第 i 个节点,j 表示孩子节点的字符,son[ i ][ j ] 的值是下一个节点是第几个创建的节点,p = son[ i ][ j ] 的作用是让 p 指针指向孩子节点;
  7. cnt 用来记录以 p 位置字符作为结尾的字符出现的次数,因为字典树的性质,假设已经有了字符串 “abcd”,p 指向 "d" 的位置,那么只有再次出现 “abcd” 这个字符串时,cnt[ p ] 才会 ++(因为如果有不一样的字符,则会跑到其他分支,或者这个位置不是字符串结尾)
posted @   wKingYu  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWIng 835] Trie字符串统计』
点击右上角即可分享
微信分享提示