36ptsTLE

P8306 【模板】字典树

Sylvia_starx @ 2023-06-30 16:07:47

#include<bits/stdc++.h>
using namespace std;
const int N = 3e6 + 5;
int trie[N][65],cnt[N];
int n,m,t,tot;
string s;
int convert(char c)
{
    if(c >= 'a' && c <= 'z')
        return c - 'a';
    else if(c >= 'A' && c <= 'Z')
        return c - 'A' + 26;
    else
        return c - '0' + 52;
    return 0;
}
void insert(string s)
{
    int u=0,len=s.size();
    for(int i=0;i<len;i++)
    {
        int c = convert(s[i]);
        if(trie[u][c] == 0)
            trie[u][c] = ++tot;
        u = trie[u][c];
        cnt[u]++;
    }
    return;
}
int search(string s)
{
    int u=0,len=s.size(),ans=0;
    for(int i=0;i<s.size();i++)
    {
        int c = convert(s[i]);
        if(trie[u][c] == 0)
            return 0;
        u = trie[u][c];
    }
    ans += cnt[u];
    return ans;
}
int main()
{
    cin>>t;
    while(t--)
    {
        memset(trie,0,sizeof(trie));
        memset(cnt,0,sizeof(cnt));
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            string t;
            cin>>t;
            insert(t);
        }
        for(int i=1;i<=m;i++)
        {
            cin>>s;
            cout<<search(s)<<"\n";
        }
    }
    return 0;
}

by Rosaya @ 2023-06-30 16:27:46

你的 memset 复杂度是 O(3 \times 10^6 \times T) 的,当然会 T。


by Sylvia_starx @ 2023-06-30 16:33:31

@Rosaya

不memset还会TLE吗?有啥解决办法?qwq


by Sylvia_starx @ 2023-06-30 16:41:47

感觉不管怎样都会T


by Rosaya @ 2023-06-30 16:57:13

memset 不会 T,你可以手动清空。


by th_2023 @ 2023-07-02 11:43:47

@liaoxueyi 可以根据tot的值,手动将已用过的trie和cnt数组进行清空。


|