結果

問題 No.2031 Colored Brackets
ユーザー norioc
提出日時 2025-03-25 20:02:45
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,567 ms / 2,000 ms
コード長 1,319 bytes
コンパイル時間 722 ms
コンパイル使用メモリ 81,776 KB
実行使用メモリ 84,124 KB
最終ジャッジ日時 2025-03-25 20:02:58
合計ジャッジ時間 11,539 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

from itertools import accumulate
from collections import defaultdict

MOD = 998244353
N = int(input())
S = input()

lparens = []
for c in S:
    v = 1 if c == '(' else -1
    lparens.append(v)

acc = list(accumulate(lparens))

ns = len(S)
dp = defaultdict(int)
dp[0, 0] = 1
for i, c in enumerate(S):
    pp = defaultdict(int)
    dp, pp = pp, dp

    lpar = acc[i-1] if i > 0 else 0  # 開きカッコの個数
    if c == '(':
        # 赤を増やす
        for j in range(ns):
            a = j         # 赤
            b = lpar - j  # 青
            if b < 0: break
            dp[a+1, b] += pp[a, b]
            dp[a+1, b] %= MOD

        # 青を増やす
        for j in range(ns):
            a = lpar - j  # 赤
            b = j         # 青
            if a < 0: break
            dp[a, b+1] += pp[a, b]
            dp[a, b+1] %= MOD
    elif c == ')':
        # 赤を減らす
        for j in range(1, ns):
            a = j  # 赤
            b = lpar - j  # 青
            if b < 0: break
            dp[a-1, b] += pp[a, b]
            dp[a-1, b] %= MOD

        # 青を減らす
        for j in range(1, ns):
            a = lpar - j  # 赤
            b = j         # 青
            if a < 0: break
            dp[a, b-1] += pp[a, b]
            dp[a, b-1] %= MOD

ans = dp[0, 0]
print(ans)
0