結果
問題 | No.1677 mæx |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:48:53 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,495 bytes |
コンパイル時間 | 168 ms |
コンパイル使用メモリ | 82,744 KB |
実行使用メモリ | 54,636 KB |
最終ジャッジ日時 | 2025-03-26 15:50:01 |
合計ジャッジ時間 | 4,004 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | TLE * 1 -- * 17 |
ソースコード
import sysMOD = 998244353def main():sys.setrecursionlimit(1 << 25)s = sys.stdin.readline().strip()K = int(sys.stdin.readline())class Node:def __init__(self):self.dp = [0, 0, 0]class DigitNode(Node):def __init__(self, c):super().__init__()self.c = cif c == '0':self.dp[0] = 1elif c == '1':self.dp[1] = 1elif c == '2':self.dp[2] = 1else: # '?'self.dp = [1, 1, 1]class FunctionNode(Node):def __init__(self, possible_types, left, right):super().__init__()self.possible_types = possible_types # list of (type, count)self.left = leftself.right = rightdef parse(s):n = len(s)stack = []i = 0while i < n:if s[i] == 'm':func_char2 = s[i+1] if i+1 < n else '?'func_types = []if func_char2 == 'a':func_types = [('max', 1)]elif func_char2 == 'e':func_types = [('mex', 1)]elif func_char2 == '?':func_types = [('max', 1), ('mex', 1)]i += 3 # skip 'm?x'# Now parse arguments inside ()i += 1 # skip '('balance = 1comma_pos = -1start = iwhile i < n:if s[i] == '(':balance += 1elif s[i] == ')':balance -= 1if balance == 0:breakelif s[i] == ',' and balance == 1 and comma_pos == -1:comma_pos = ii += 1left_str = s[start:comma_pos]right_str = s[comma_pos+1:i]# Parse left and rightleft = parse(left_str)right = parse(right_str)node = FunctionNode(func_types, left, right)stack.append(node)i += 1 # move past ')'elif s[i] in {'0', '1', '2', '?'}:node = DigitNode(s[i])stack.append(node)i += 1else:i += 1return stack[0] if stack else Noneroot = parse(s)mex_table = [[1, 2, 1],[2, 0, 0],[1, 0, 0]]def compute_dp(node):if isinstance(node, DigitNode):returnif isinstance(node, FunctionNode):compute_dp(node.left)compute_dp(node.right)left_dp = node.left.dpright_dp = node.right.dpnew_dp = [0, 0, 0]for func_type, count in node.possible_types:for a in range(3):for b in range(3):if func_type == 'max':res = max(a, b)else:res = mex_table[a][b]contrib = left_dp[a] * right_dp[b] % MODcontrib = contrib * count % MODnew_dp[res] = (new_dp[res] + contrib) % MODnode.dp = new_dpcompute_dp(root)print(root.dp[K] % MOD if root else 0)if __name__ == "__main__":main()