trie-word search tree template

#include <iostream>

using namespace std;

const int N = 20010;

int son[N][26], cnt[N], idx; // son[i]数组存放存放第i个节点其各个子节点的下标, cnt数组表示以该节点结尾的单词数, idx表示当前节点序号

void insert(char str[])
{
    
    
    int p = 0; // 根节点
    for (int i = 0; str[i]; i++)
    {
    
    
        int x = str[i] - 'a';
        if (!son[p][x]) son[p][x] = ++idx; // 若不存在, 则插入
        p = son[p][x];
    }
    cnt[p]++;
}

int query(char str[])
{
    
    
    int p = 0; 
    for (int i = 0; str[i]; i++)
    {
    
    
        int x = str[i] - 'a';
        if (!son[p][x]) return 0; 
        p = son[p][x];
    }
    return cnt[p];
}

int main()
{
    
    
    int n;
    char op[2], str[100005];
    
    cin >> n;
    while (n--)
    {
    
    
        cin >> op >> str;
        if (op[0] == 'I') insert(str);
        else cout << query(str) << endl;
    }
    
    return 0;
}

Guess you like

Origin blog.csdn.net/PBomb/article/details/107508518