蒟蒻求助,被卡常卡吐了

P8306 【模板】字典树

stripe_python @ 2023-08-19 08:58:45

用的是自己的 Trie 模板,TLE on #3, 4, 5,已经试过各位大佬的方法,改了 memset,但还是 T,没有改 cin/cout (说好的不卡常),求调

#include <bits/stdc++.h>
#define N 3000005
#define M 65
using namespace std;

int t, n, q;
string s;

class Trie {
protected:
    function<int(char)> mapping;
    int t[N][M], cnt[N];
    int tot;

public:
    Trie() : tot(0) {
        mapping = [](char x) -> int {
            if ('A' <= x && x <= 'Z') return x - 'A';
            else if ('a' <= x && x <= 'z') return x - 'a' + 26;
            else return x - '0' + 52;
        };
    }

    Trie(function<int(char)>& func) : tot(0) {
        mapping = func;
    }

    void clear() {
        memset(t, 0, sizeof(t[0]) * tot);
        memset(cnt, 0, sizeof(int) * tot);
    }

    void insert(const string& s) {
        int p = 0, n = (int) s.size();
        for (int i = 0; i < n; i++) {
            int c = mapping(s[i]);
            if (!t[p][c]) t[p][c] = ++tot;
            p = t[p][c];
            cnt[p]++;
        }
    }

    int find(const string& s) {
        int p = 0, n = (int) s.size();
        for (int i = 0; i < n; i++) {
            int c = mapping(s[i]);
            if (!t[p][c]) return 0;
            p = t[p][c];
        }
        return cnt[p];
    }
};

Trie trie;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin >> t;
    while (t--) {
        trie.clear();
        cin >> n >> q;
        while (n--) {
            cin >> s;
            trie.insert(s);
        }
        while (q--) {
            cin >> s;
            cout << trie.find(s) << '\n';
        }
    }
    return 0;
}

by Mysterious_Cat @ 2023-08-19 09:48:46

首先你多测清空就不要用 memset。这样不会 T,而且也不用学 memset 的高级用法。


by stripe_python @ 2023-08-19 10:29:53

@Mysterious_Cat 谢谢,我改一下


by stripe_python @ 2023-08-19 10:36:51

@Mysterious_Cat 感谢大佬,已A


|