Acwing 835. Trie字符串统计

Acwing 835. Trie字符串统计

题目描述

在这里插入图片描述

代码展示

//这个代码的注释好难写,以自己理解为主
#include<iostream>

using namespace std;
const int N = 100010;
int idx; // 各个节点的编号,根节点编号为0
int son[N][26];//Trie 树本身
//cnt[x] 表示:以 编号为 x 为结尾的字符串的个数
int cnt[N];

int n;

void insert(string s) {
    int p = 0;//指向根节点
    for (int i = 0; i < s.size(); i++) {
        //将当前字符转换成数字(a->0, b->1,...)
        int u = s[i] - 'a';
        //如果数中不能走到当前字符
        //为当前字符创建新的节点,保存该字符
        if (!son[p][u])
            // 新节点编号为 idx + 1
            son[p][u] = ++idx;
        p = son[p][u];
    }
    //这个时候,p 等于字符串 s 的尾字符所对应的 idx
    //cnt[p] 保存的是字符串 s 出现的次数
    //故 cnt[p] ++
    cnt[p]++;
}

int query(string s) {
    int p = 0;//指向根节点
    for (int i = 0; i < s.size(); i++) {
        //将当前字符转换成数字(a->0, b->1,...)
        int u = s[i] - 'a';
        //如果走不通了,即树中没有保存当前字符
        //则说明树中不存在该字符串
        if (!son[p][u])
            return 0;
        //指向下一个节点
        p = son[p][u];
    }
    //循环结束的时候,p 等于字符串 s 的尾字符所对应的 idx
    // cnt[p] 就是字符串 s 出现的次数
    return cnt[p];
}

int main() {
    cin >> n;
    string s;
    char q;
    while (n--) {
        cin >> q >> s;
        if (q == 'I') {
            //插入操作
            insert(s);
        } else {
            //查询操作
            cout << query(s) << endl;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值