結果

問題 No.1677 mæx
ユーザー akakimidoriakakimidori
提出日時 2021-08-14 03:13:31
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 5 ms / 2,000 ms
コード長 1,570 bytes
コンパイル時間 13,105 ms
コンパイル使用メモリ 405,508 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-06-11 21:43:10
合計ジャッジ時間 12,060 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,812 KB
testcase_01 AC 1 ms
6,816 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 AC 1 ms
6,944 KB
testcase_04 AC 5 ms
6,944 KB
testcase_05 AC 4 ms
6,940 KB
testcase_06 AC 4 ms
6,944 KB
testcase_07 AC 5 ms
6,944 KB
testcase_08 AC 5 ms
6,940 KB
testcase_09 AC 4 ms
6,940 KB
testcase_10 AC 5 ms
6,940 KB
testcase_11 AC 5 ms
6,944 KB
testcase_12 AC 4 ms
6,940 KB
testcase_13 AC 5 ms
6,944 KB
testcase_14 AC 4 ms
6,940 KB
testcase_15 AC 5 ms
6,940 KB
testcase_16 AC 4 ms
6,944 KB
testcase_17 AC 4 ms
6,944 KB
testcase_18 AC 4 ms
6,944 KB
testcase_19 AC 1 ms
6,944 KB
testcase_20 AC 1 ms
6,940 KB
testcase_21 AC 5 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

fn read() -> (Vec<u8>, usize) {
    use std::io::Read;
    let mut s = String::new();
    std::io::stdin().read_to_string(&mut s).unwrap();
    let mut it = s.trim().split_whitespace();
    let s = it.next().unwrap().bytes().collect::<Vec<_>>();
    let k = it.next().unwrap().parse::<usize>().unwrap();
    assert!(k <= 2);
    (s, k)
}

fn elem(s: &str, c: u8) {
    assert!(s.bytes().find(|p| *p == c).is_some());
}

const MOD: u64 = 998_244_353;

fn calc(k: &mut usize, s: &[u8]) -> [u64; 3] {
    let f = s[*k];
    *k += 1;
    let mut res = [0; 3];
    if f == b'm' {
        let op = s[*k];
        *k += 1;
        elem("ae?", op);
        elem("x", s[*k]);
        *k += 1;
        elem("(", s[*k]);
        *k += 1;
        let lhs = calc(k, s);
        elem(",", s[*k]);
        *k += 1;
        let rhs = calc(k, s);
        elem(")", s[*k]);
        *k += 1;
        for (i, l) in lhs.iter().enumerate() {
            for (j, r) in rhs.iter().enumerate() {
                if op != b'e' {
                    res[i.max(j)] += *l * *r;
                }
                if op != b'a' {
                    let x = (0..).find(|x| *x != i && *x != j).unwrap();
                    res[x] += *l * *r;
                }
            }
        }
    } else {
        elem("0123?", f);
        if f == b'?' {
            res = [1; 3];
        } else {
            res[(f - b'0') as usize] = 1;
        }
    }
    res.iter_mut().for_each(|p| *p %= MOD);
    res
}

fn main() {
    let (s, k) = read();
    let ans = calc(&mut 0, &s)[k];
    println!("{}", ans);
}
0