其他分享
首页 > 其他分享> > 蓝桥杯必看 【手撕模板】三分钟搞懂 <Trie树(字典树)>

蓝桥杯必看 【手撕模板】三分钟搞懂 <Trie树(字典树)>

作者:互联网


#include<iostream>
const int N = 1e6 + 10;
using namespace std;

int son[N][26],book[N],cur;(1)
int n ;
char str[N],ch;

void insert(char str[])
{
    int p = 0;(2)
    for(int i = 0 ; str[i] ;i ++)//遍历整个数组
    {
        int u = str[i] - 'a';(3)
        if(!son[p][u])  son[p][u] =  ++ cur; // 同时idx自增 使得每个字符的映射拥有唯一的下标
        
        p = son[p][u];
    }
    
    book[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 book[p];
}

int main()
{
    int n;
    cin>>n;
    while (n -- )
    {
        char op;
        cin >> op >> str;
        if (op == 'I') insert(str);
        else printf("%d\n", query(str));
    }

    return 0;
}

Ps:
(1)son[p][u]表示 p 这个节点是否含有u这个映射
(2)根节点 最初对应的映射是 0
(3)将小写字母a ~ z映射到0 ~ 25 方便利用数组操作
(4)

标签:char,映射,必看,int,son,蓝桥,++,str,搞懂
来源: https://blog.csdn.net/GuLeng______/article/details/123038301