提出 #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 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |