trie全炸求调

P8306 【模板】字典树

Qianmo_su @ 2023-03-02 20:09:49

#include <bits/stdc++.h>
using namespace std;

const int N = 3e6+10;
int t[N][65],cnt[N],id,n,q,m;
string str;

//字符转化成为ASCII码
int getnum(char x)
{
    if(x>='A'&&x<='Z')
        return x-'A';
    else if(x>='a'&&x<='z')
        return x-'a'+26;
    else
        return x-'0'+52;
}
//建树
void insert(string s)
{
    int p = 0;
    for(int i=0;i<s.size();i++)
    {
        int x = getnum(s[i]);
        if(t[p][x] == 0) t[p][x] = id++;
        p = t[p][x];
        cnt[p]++;
    }
}
//查询
int find(string s)
{
    int p = 0;
    for(int i=0;i<s.size();i++)
    {
        int x = getnum(s[i]);
        //没有找到
        if(t[p][x] == 0) return 0;
        p = t[p][x];
    }
    return cnt[p];
}

int main()
{
    cin >> m;
    while(m--)
    {
        memset(t,0,sizeof(t));
        memset(cnt,0,sizeof(cnt));
        id = 0;
        cin >> n >> q;
        for(int i=1;i<=n;i++)
        {
            cin >> str;
            insert(str);
        }
        for(int i=1;i<=q;i++)
        {
            cin >> str;
            cout << find(str) << endl;
        }
    }
    return 0;
}

by __QHY__ @ 2023-03-02 20:19:53

您的代码开O2会WA#1与#6,TLE其它点。 建议您改一下代码。(代码有点长,懒得看。。。)


|