字典树 trie

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 3e6 + 10;
int tr[N][26 + 26 + 10 + 1];
int tot;
int f[N];
char s[100000 + 10];
//边是字符
int id(char c)
{
    if (c >= 'A' && c <= 'Z')
    {
        return c - 'A' + 1;
    }
    if (c >= 'a' && c <= 'z')
    {
        return c - 'a' +26 + 1;
    }
    return c - '0' + 26 + 26 + 1;
}
void dfs(int k)
{
    for (int i = 1; i <= 26 + 26 + 10; i++)
    {
        if (tr[k][i])
        {
            dfs(tr[k][i]);
            f[k] += f[tr[k][i]];
        }
    }
}
int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int T;
    cin >> T;
    while (T--)
    {
        tot = 1;
        int n, q;
        cin >> n >> q;
        while (n--)
        {
            cin >> s + 1;
            int k = 1;//根
            int len = strlen(s + 1);
            for (int i = 1; i <= len; i++)
            {
                int t = id(s[i]);
                if (tr[k][t] == 0)
                {
                    tr[k][t] = ++tot;
                }
                k = tr[k][t];
            }
            ++f[k];//结束单词
        }
        dfs(1);
        while (q--)
        {
            cin >> s + 1;
            int len = strlen(s + 1);
            int k = 1;
            for (int i = 1; i <= len; i++)
            {
                int t = id(s[i]);
                k = tr[k][t];
            }
            cout << f[k] << '\n';
        }
        for (int i = 1; i <= tot; i++)
        {
            f[i] = 0;
            for (int j = 1; j <= 26 + 26 + 10; j++)
            {
                tr[i][j] = 0;
            }
        }
    }
    return 0;
}
posted @ 2025-01-25 14:45  闫柏军  阅读(10)  评论(0)    收藏  举报