字典树(Trie 树)

介绍

字典树是一种树形结构,核心思想是空间换时间,利用字符串的公共前缀来建树。可以快速查找在一对字符串匹配目标字符串。

例子

现有以下字符出:

  • abcab
  • ababa
  • ababb

那么树长这个样子,为了方便遍历加一个树根。

要匹配某个字符串遍历整个树即可。

例题:P8306 【模板】字典树

参考代码

#include <bits/stdc++.h>
using namespace std;
struct Node
{
    int cnt;
    unordered_map<char, Node*> ch;
    Node() : cnt(0) {}
};
Node *root;
void dfs(Node *root)
{
    for (auto [x, y] : root->ch)
    {
        dfs(y);
        delete y;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    string s;
    int T, n, q;
    for (cin >> T; T; --T)
    {
        cin >> n >> q;
        root = new Node;
        for (int i = 1; i <= n; ++i)
        {
            cin >> s;
            auto u = root;
            for (auto c : s)
            {
                u = (u->ch[c] ? u->ch[c] : u->ch[c] = new Node);
                ++u->cnt;
            }
        }
        for (int i = 1; i <= q; ++i)
        {
            cin >> s;
            bool flag = 1;
            auto u = root;
            for (auto c : s)
            {
                if (u->ch.find(c) != u->ch.end())
                    u = u->ch[c];
                else
                {
                    flag = 0;
                    break;
                }
            }
            cout << (flag ? u->cnt : 0) << endl;
            
        }
        //dfs(root);
        //delete root;
    }
    return 0;
}
posted @ 2023-02-24 00:02  何太狼  阅读(15)  评论(0编辑  收藏  举报