MOD = 998244353 s = input().strip() from collections import defaultdict dp = defaultdict(int) dp[(0, 0)] = 1 for c in s: new_dp = defaultdict(int) for (prev_min, prev_max), cnt in dp.items(): if c == '.': # Replace with '(' new_min = prev_min + 1 new_max = prev_max + 1 new_min_clamped = new_min new_max_clamped = new_max if new_max_clamped >= 0: new_dp[(new_min_clamped, new_max_clamped)] = (new_dp[(new_min_clamped, new_max_clamped)] + cnt) % MOD # Replace with ')' new_min = prev_min - 1 new_max = prev_max - 1 new_min_clamped = max(new_min, 0) new_max_clamped = new_max if new_max_clamped >= 0: new_dp[(new_min_clamped, new_max_clamped)] = (new_dp[(new_min_clamped, new_max_clamped)] + cnt) % MOD # Replace with '?' new_min = prev_min - 1 new_max = prev_max + 1 new_min_clamped = max(new_min, 0) new_max_clamped = new_max if new_max_clamped >= 0: new_dp[(new_min_clamped, new_max_clamped)] = (new_dp[(new_min_clamped, new_max_clamped)] + cnt) % MOD else: if c == '(': new_min = prev_min + 1 new_max = prev_max + 1 elif c == ')': new_min = prev_min - 1 new_max = prev_max - 1 else: # '?' new_min = prev_min - 1 new_max = prev_max + 1 new_min_clamped = max(new_min, 0) new_max_clamped = new_max if new_max_clamped >= 0: new_dp[(new_min_clamped, new_max_clamped)] = (new_dp[(new_min_clamped, new_max_clamped)] + cnt) % MOD dp = new_dp result = 0 for (min_b, max_b), cnt in dp.items(): if min_b <= 0 <= max_b: result = (result + cnt) % MOD print(result)