結果

問題 No.1677 mæx
ユーザー nebukuro09nebukuro09
提出日時 2021-09-10 23:46:34
言語 D
(dmd 2.106.1)
結果
AC  
実行時間 21 ms / 2,000 ms
コード長 2,427 bytes
コンパイル時間 733 ms
コンパイル使用メモリ 112,872 KB
実行使用メモリ 14,248 KB
最終ジャッジ日時 2024-06-22 12:28:28
合計ジャッジ時間 1,882 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 1 ms
6,944 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 AC 1 ms
6,940 KB
testcase_04 AC 20 ms
12,648 KB
testcase_05 AC 21 ms
11,424 KB
testcase_06 AC 19 ms
11,532 KB
testcase_07 AC 20 ms
11,460 KB
testcase_08 AC 20 ms
11,508 KB
testcase_09 AC 20 ms
12,784 KB
testcase_10 AC 20 ms
11,424 KB
testcase_11 AC 20 ms
12,276 KB
testcase_12 AC 20 ms
11,440 KB
testcase_13 AC 20 ms
11,396 KB
testcase_14 AC 20 ms
12,552 KB
testcase_15 AC 20 ms
12,712 KB
testcase_16 AC 20 ms
11,400 KB
testcase_17 AC 20 ms
11,428 KB
testcase_18 AC 20 ms
11,428 KB
testcase_19 AC 1 ms
6,944 KB
testcase_20 AC 1 ms
6,940 KB
testcase_21 AC 20 ms
14,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import std.stdio, std.array, std.string, std.conv, std.algorithm;
import std.typecons, std.range, std.random, std.math, std.container;
import std.numeric, std.bigint, core.bitop;

immutable long MOD = 998244353;
enum Exp { MAX, MEX, UNKNOWN };

class Node {
    bool isLeaf;
    Exp exp;
    int num;
    long[3] cnt;
    Node left;
    Node right;
}

void main() {
    auto S = readln.chomp;
    auto K = readln.chomp.to!int;

    int idx = 0;

    Node parse() {
        Node node = new Node;
        if (S[idx] == ',') idx++;
        if (S[idx] == 'm') {
            node.isLeaf = false;
            if (S[idx..idx+3] == "max") {
                node.exp = Exp.MAX;
            } else if (S[idx..idx+3] == "mex") {
                node.exp = Exp.MEX;
            } else {
                node.exp = Exp.UNKNOWN;
            }
            idx += 4;
            node.left = parse();
            idx += 1;
            node.right = parse();
            idx += 1;
        } else {
            node.isLeaf = true;
            if (S[idx] != '?') {
                node.num = S[idx] - '0';
            } else  {
                node.num = -1;
            }
        }
        return node;
    }

    auto mex = new int[][](3, 3);

    int mex_(int i, int j) {
        foreach (k; 0..3) if (k != i && k != j) return k;
        assert(0);
    }

    foreach (i; 0..3) foreach (j; 0..3) mex[i][j] = mex_(i, j);

    void calc(Node node) {
        if (node.isLeaf) {
            if (node.num == -1) {
                node.cnt = [1, 1, 1];
            } else {
                node.cnt[node.num] = 1;
            }
            return;
        }

        calc(node.left);
        calc(node.right);

        if (node.exp == Exp.MAX) {
            foreach (i; 0..3) foreach (j; 0..3) {
                (node.cnt[max(i, j)] += node.left.cnt[i] * node.right.cnt[j] % MOD) %= MOD;
            }
        } else if (node.exp == Exp.MEX) {
            foreach (i; 0..3) foreach (j; 0..3) {
                (node.cnt[mex[i][j]] += node.left.cnt[i] * node.right.cnt[j] % MOD) %= MOD;
            }
        } else {
            foreach (i; 0..3) foreach (j; 0..3) {
                (node.cnt[max(i, j)] += node.left.cnt[i] * node.right.cnt[j] % MOD) %= MOD;
                (node.cnt[mex[i][j]] += node.left.cnt[i] * node.right.cnt[j] % MOD) %= MOD;
            }
        }
    }

    auto root = parse();
    calc(root);
    writeln(root.cnt[K]);
}
0