Trie字符串统计(Trie树)

Trie树

Trie:用来高效存储和查找的字符串集合,从根节点开始依次存储字符串的各个字符, 并在最后一个字符中做出标记表示 以此结束是一个字符串。

image

例题

image

测试样例

5
I abc
Q abc
Q ab
I ab
Q ab

预期输出:

1
0
1

代码实现

#include<bits/stdc++.h>
using namespace std;
​
const int N =1e5+10;
​
int son[N][26];//题目只存储小写字母,故一个结点最多有26个边
int cnt[N] ,idx;//cnt[]存储某个节点的标记,表示有多少个以此结尾。idx表示当前下标
char str[N];//每次输入的字符;
​
void insert(char str[]){
    int p=0;
    for(int i=0;i<strlen(str);i++)
    {
        int u =str[i]-'a';
        if(!son[p][u]) son[p][u]= ++idx; //这里的P指的是第几个节点,按插入顺序确定的,u表示的是这个节点存储的字符。
        p=son[p][u];
    }
    cnt[p] ++; //循环结束时p表示的节点就是一个字符完成的节点。
}
​
int query(char str[]){
    int p=0;
    for(int i=0;i<strlen(str);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[2];
        scanf("%s%s",op,str);
        if(op[0]== 'I') insert(str);
        else cout<<query(str)<<endl;
    }
}
​

  

 
posted @ 2025-09-06 21:15  小花护符  阅读(8)  评论(0)    收藏  举报