提出 #67007456


ソースコード 拡げる

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <numeric>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <atcoder/all>
using namespace std;

using mint = atcoder::modint998244353;

struct trie {
    using ar = array<int, 2>;
    vector<ar> pos;
    ar def;
    int now_sz;
    vector<int> cnt_node;
    vector<mint> cnt_ok;
    vector<bool> is_terminated;
    trie() = default;
    trie(int len) {
        pos.reserve(len + 1);
        cnt_ok.reserve(len + 1);
        cnt_node.reserve(len + 1);
        is_terminated.reserve(len + 1);
        def.fill(-1);
        now_sz = 0;
        make_node();
    }
    int make_node() {
        pos.push_back(def);
        cnt_ok.push_back(0);
        cnt_node.push_back(0);
        is_terminated.push_back(false);
        return now_sz++;
    }
    void add(string &s) {
        vector<int> idx = {0};
        idx.reserve(s.size());
        int now = 0;
        for(int i = 0; i < (int)s.size(); i++) {
            

            cnt_node[now]++;

            int d = s[i] - 'A';
            int &nx = pos[now][d];
            if (nx == -1)
                nx = make_node();
            
            if (i == (int)s.size() - 1)
                is_terminated[nx] = true;

            now = nx;
            idx.push_back(now);
        }

        // 逆順にcntを更新したい
        reverse(idx.begin(), idx.end());
        for (int i = 0; i < (int)idx.size(); i++) {
            int j = idx[i];

            mint tmp = 1;
            // そこで終わるものがない場合
            // 両方のノードでいい感じに終わってもらう必要がある
            for (int d = 0; d < 2; d++) {
                if (pos[j][d] == -1) 
                    tmp *= 0;
                else 
                    tmp *= cnt_ok[pos[j][d]];
            }
            // そこで終わるものがあって採用する場合
            // 下のノードはどう選んでもよい
            if (is_terminated[j]) {
                tmp += mint(2).pow(cnt_node[j]);
            }
                
            cnt_ok[j] = tmp;

            // cout << j << ' ';
            // cout << cnt_ok[j].val() << ' ';
        }
        // cout << endl;
    }
};

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    for (int i = 0; i < N; i++) cin >> S[i];

    trie tr(1'000'000);
    for (int i = 0; i < N; i++) {
        tr.add(S[i]);

        cout << tr.cnt_ok[0].val() << endl;
    }
    return 0;
}

提出情報

提出日時
問題 C - Prefix Covering
ユーザ miyama_akane
言語 C++ 20 (gcc 12.2)
得点 600
コード長 2673 Byte
結果 AC
実行時間 66 ms
メモリ 15560 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 54
セット名 テストケース
Sample sample-01.txt, sample-02.txt
All 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 05-01.txt, 05-02.txt, 05-03.txt, 05-04.txt, 05-05.txt, 05-06.txt, 05-07.txt, 05-08.txt, 06-01.txt, 06-02.txt, 06-03.txt, 06-04.txt, 06-05.txt, 06-06.txt, 06-07.txt, 06-08.txt, 07-01.txt, 07-02.txt, 07-03.txt, 07-04.txt, 07-05.txt, 08-01.txt, 08-02.txt, 08-03.txt, 08-04.txt, 09-01.txt, 09-02.txt, 09-03.txt, 09-04.txt, sample-01.txt, sample-02.txt
ケース名 結果 実行時間 メモリ
02-01.txt AC 1 ms 3508 KiB
02-02.txt AC 1 ms 3516 KiB
02-03.txt AC 1 ms 3460 KiB
02-04.txt AC 1 ms 3572 KiB
02-05.txt AC 1 ms 3512 KiB
02-06.txt AC 1 ms 3520 KiB
02-07.txt AC 1 ms 3584 KiB
02-08.txt AC 2 ms 3584 KiB
02-09.txt AC 2 ms 3748 KiB
02-10.txt AC 4 ms 3636 KiB
02-11.txt AC 7 ms 3844 KiB
02-12.txt AC 13 ms 3896 KiB
02-13.txt AC 27 ms 3972 KiB
02-14.txt AC 52 ms 4844 KiB
03-01.txt AC 4 ms 3520 KiB
03-02.txt AC 7 ms 3620 KiB
03-03.txt AC 14 ms 3728 KiB
03-04.txt AC 27 ms 3980 KiB
03-05.txt AC 53 ms 4780 KiB
04-01.txt AC 17 ms 15560 KiB
04-02.txt AC 17 ms 15556 KiB
04-03.txt AC 16 ms 12392 KiB
04-04.txt AC 16 ms 12384 KiB
05-01.txt AC 66 ms 5736 KiB
05-02.txt AC 64 ms 6000 KiB
05-03.txt AC 64 ms 6108 KiB
05-04.txt AC 62 ms 6344 KiB
05-05.txt AC 62 ms 6320 KiB
05-06.txt AC 40 ms 9228 KiB
05-07.txt AC 29 ms 10580 KiB
05-08.txt AC 18 ms 11644 KiB
06-01.txt AC 63 ms 5552 KiB
06-02.txt AC 61 ms 5836 KiB
06-03.txt AC 60 ms 6056 KiB
06-04.txt AC 58 ms 6352 KiB
06-05.txt AC 58 ms 6368 KiB
06-06.txt AC 38 ms 9336 KiB
06-07.txt AC 29 ms 10576 KiB
06-08.txt AC 18 ms 11624 KiB
07-01.txt AC 43 ms 5760 KiB
07-02.txt AC 43 ms 5832 KiB
07-03.txt AC 40 ms 5828 KiB
07-04.txt AC 41 ms 5756 KiB
07-05.txt AC 42 ms 5840 KiB
08-01.txt AC 44 ms 5840 KiB
08-02.txt AC 44 ms 5824 KiB
08-03.txt AC 45 ms 6004 KiB
08-04.txt AC 47 ms 5904 KiB
09-01.txt AC 43 ms 5904 KiB
09-02.txt AC 45 ms 5816 KiB
09-03.txt AC 46 ms 5832 KiB
09-04.txt AC 46 ms 5880 KiB
sample-01.txt AC 1 ms 3716 KiB
sample-02.txt AC 1 ms 3584 KiB