提出 #16537362


ソースコード 拡げる

#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <functional>

template <int K, class T>
struct Trie {
    struct Node {
        std::array<int, K> nxt;
        int id, sz, ch;
        explicit Node() : id(-1), sz(0), ch(0) { nxt.fill(-1); }
    };

    std::vector<Node> nodes;
    std::function<int(T)> enc;
    std::vector<std::vector<int>> travs;

    explicit Trie(T base) {
        nodes.emplace_back();
        enc = [=](T c) { return c - base; };
    }

    template <class Container>
    void add(const Container& s, int id) {
        int pos = 0;

        for (T c : s) {
            ++nodes[pos].sz;

            int ci = enc(c);

            int npos = nodes[pos].nxt[ci];
            if (npos == -1) {
                npos = nodes.size();
                nodes[pos].nxt[ci] = npos;
                nodes.emplace_back();

                ++nodes[pos].ch;
            }
            pos = npos;
        }

        ++nodes[pos].sz;
        nodes[pos].id = id;
    }

    int dfs(int pos, std::vector<int>& cs) {
        if (nodes[pos].id != -1) travs[nodes[pos].id] = cs;

        int ret = pos;
        for (int c = 0; c < K; ++c) {
            int npos = nodes[pos].nxt[c];
            if (npos == -1) continue;

            // reducible?
            bool red = (nodes[pos].ch == 1) &&
                       (nodes[pos].id == -1);

            if (!red) cs.push_back(c);
            nodes[pos].nxt[c] = dfs(npos, cs);
            if (!red) {
                cs.pop_back();
            } else {
                ret = nodes[pos].nxt[c];  // 圧縮
            }
        }
        return ret;
    }

    void compress(int n) {
        travs.resize(n);
        std::vector<int> cs;

        for (int c = 0; c < K; ++c) {
            int pos = nodes[0].nxt[c];
            if (pos == -1) continue;

            // 根は圧縮しない
            cs.push_back(c);
            nodes[0].nxt[c] = dfs(pos, cs);
            cs.pop_back();
        }
    }

    Node& operator[](int pos) { return nodes[pos]; }
    Node operator[](int pos) const { return nodes[pos]; }
};

void solve() {
    int n;
    std::cin >> n;

    Trie<26, char> trie('a');
    for (int i = 0; i < n; ++i) {
        std::string s;
        std::cin >> s;
        trie.add(s, i);
    }

    trie.compress(n);

    int q;
    std::cin >> q;
    while (q--) {
        int k;
        std::cin >> k;
        --k;

        std::vector<int> cs(26);
        for (auto& c : cs) {
            char d;
            std::cin >> d;
            c = d - 'a';
        }

        // Trieを辿る
        int pos = 0, ans = 1;
        for (auto c : trie.travs[k]) {
            if (trie[pos].id != -1) ++ans;

            for (auto d : cs) {
                int npos = trie[pos].nxt[d];
                if (d != c) {
                    if (npos != -1) ans += trie[npos].sz;
                } else {
                    pos = npos;
                    break;
                }
            }
        }

        std::cout << ans << "\n";
    }
}

int main() {
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);

    solve();

    return 0;
}

提出情報

提出日時
問題 E - Lexicographical disorder
ユーザ Tiramister
言語 C++ (GCC 9.2.1)
得点 1100
コード長 3145 Byte
結果 AC
実行時間 1050 ms
メモリ 79820 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1100 / 1100
結果
AC × 2
AC × 42
セット名 テストケース
Sample s1.txt, s2.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, 39.txt, 40.txt, s1.txt, s2.txt
ケース名 結果 実行時間 メモリ
01.txt AC 126 ms 20104 KiB
02.txt AC 134 ms 19916 KiB
03.txt AC 119 ms 19972 KiB
04.txt AC 125 ms 20096 KiB
05.txt AC 167 ms 62636 KiB
06.txt AC 148 ms 62504 KiB
07.txt AC 144 ms 62648 KiB
08.txt AC 139 ms 62592 KiB
09.txt AC 139 ms 62596 KiB
10.txt AC 143 ms 62664 KiB
11.txt AC 103 ms 9068 KiB
12.txt AC 105 ms 10920 KiB
13.txt AC 107 ms 13692 KiB
14.txt AC 158 ms 62588 KiB
15.txt AC 146 ms 62620 KiB
16.txt AC 144 ms 62804 KiB
17.txt AC 150 ms 79820 KiB
18.txt AC 911 ms 5156 KiB
19.txt AC 909 ms 5072 KiB
20.txt AC 1039 ms 5172 KiB
21.txt AC 1036 ms 5184 KiB
22.txt AC 1050 ms 5108 KiB
23.txt AC 116 ms 18160 KiB
24.txt AC 98 ms 9124 KiB
25.txt AC 103 ms 11364 KiB
26.txt AC 739 ms 4944 KiB
27.txt AC 85 ms 10760 KiB
28.txt AC 84 ms 10844 KiB
29.txt AC 78 ms 10792 KiB
30.txt AC 104 ms 18252 KiB
31.txt AC 88 ms 18192 KiB
32.txt AC 80 ms 18220 KiB
33.txt AC 89 ms 33040 KiB
34.txt AC 81 ms 19340 KiB
35.txt AC 93 ms 33008 KiB
36.txt AC 130 ms 21872 KiB
37.txt AC 104 ms 41856 KiB
38.txt AC 103 ms 41936 KiB
39.txt AC 6 ms 3520 KiB
40.txt AC 2 ms 3536 KiB
s1.txt AC 2 ms 3488 KiB
s2.txt AC 2 ms 3492 KiB