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

2022/2/21 6:29:18

本文主要是介绍蓝桥杯必看 【手撕模板】三分钟搞懂 <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)



这篇关于蓝桥杯必看 【手撕模板】三分钟搞懂 <Trie树(字典树)>的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程