import sys MOD = 998244353 def main(): S = sys.stdin.readline().strip() K = int(sys.stdin.readline()) from functools import lru_cache @lru_cache(maxsize=None) def dp(start, end): s_part = S[start:end] if len(s_part) == 1: if s_part[0] == '0': return (1, 0, 0) elif s_part[0] == '1': return (0, 1, 0) elif s_part[0] == '2': return (0, 0, 1) elif s_part[0] == '?': return (1, 1, 1) else: return (0, 0, 0) else: if not (len(s_part) >= 5 and s_part.startswith('m') and s_part[2] == 'x' and s_part[3] == '(' and s_part[-1] == ')'): return (0, 0, 0) c = s_part[1] if c not in ['a', 'e', '?']: return (0, 0, 0) possible_funcs = [] if c == 'a': possible_funcs = ['max'] elif c == 'e': possible_funcs = ['mex'] else: possible_funcs = ['max', 'mex'] inner_str = s_part[4:-1] comma_pos = find_split_comma(inner_str) if comma_pos == -1: return (0, 0, 0) a_start = start + 4 a_end = a_start + comma_pos b_start = a_end + 1 b_end = start + 4 + len(inner_str) a_counts = dp(a_start, a_end) b_counts = dp(b_start, b_end) res = [0, 0, 0] for func in possible_funcs: func_multiplier = 1 for a_val in range(3): for b_val in range(3): if func == 'max': val = max(a_val, b_val) else: s = {a_val, b_val} val = 0 while val in s: val += 1 if val > 2: val = 0 contrib = (a_counts[a_val] * b_counts[b_val]) % MOD contrib = (contrib * func_multiplier) % MOD res[val] = (res[val] + contrib) % MOD return tuple(res) def find_split_comma(s): balance = 0 for i, c in enumerate(s): if c == '(': balance += 1 elif c == ')': balance -= 1 if balance < 0: return -1 elif c == ',' and balance == 0: return i return -1 result = dp(0, len(S)) print(result[K] % MOD) if __name__ == '__main__': main()