問題一覧 > 通常問題

No.3099 Parentheses Decomposition

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 84
作問者 : shobonvip / テスター : noya2
1 ProblemId : 11623 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2025-04-11 21:19:22

問題文

正しいカッコ列を、次の条件のいずれかを満たす文字列と定めます。

  • 空文字列
  • 正しいカッコ列 $A$ が存在して ( $A$ ) をこの順につなげたもの
  • 空でない正しいカッコ列 $A, B$ が存在して $A, B$ をこの順につなげたもの

たとえば (())() は正しいカッコ列であり、 ()()( は正しいカッコ列ではありません。

正の偶数 $N$ に対して、長さ $N$ のA型の正しいカッコ列を次のように定めます。

  • $1 \le i \le N/2$ に対し $S_i$ は (
  • $N/2+1 \le i \le N$ に対し $S_i$ は )

たとえば、 (())((((())))) は A型の正しいカッコ列です。

正の偶数 $N$ に対して、長さ $N$ のB型の正しいカッコ列を次のように定めます。

  • $i$ が奇数のとき $S_i$ は (
  • $i$ が偶数のとき $S_i$ は )

たとえば、 ()()()()()()() は B型の正しいカッコ列です。

長さ $N$ の A型 または B型 の正しいカッコ列 $S$ が与えられます。$0, 1$ からなる長さ $N$ の列 $T$ であって、次の条件を満たすものの個数を求めてください。

  • $T_i = 0$ となる整数 $i$ $(1\le i \le N)$ がある場合、$T_i = 0$ となる $i$ を昇順に $P_1, \cdots, P_k$ とする。 $S_{P_1}, \cdots, S_{P_k}$ を順につなげたものを $X$ とすると、 $X$ は正しいカッコ列である。
  • $T_i = 1$ となる整数 $i$ $(1\le i \le N)$ がある場合、$T_i = 1$ となる $i$ を昇順に $Q_1, \cdots, Q_l$ とする。 $S_{Q_1}, \cdots, S_{Q_l}$ を順につなげたものを $Y$ とすると、 $Y$ は正しいカッコ列である。

ただし、答えは非常に大きくなる場合があるため、 $998244353$ で割った余りを出力してください。

制約

  • $2 \le N \le 5\times 10^5$
  • $N$ は偶数である
  • $S$ は A型 または B型 の正しいカッコ列である

入力

$N$
$S$

出力

答えを出力してください。

サンプル

サンプル1
入力
4
(())
出力
6

入力の文字列は A 型の正しいカッコ列です。条件を満たす $T$ と、対応する $X$, $Y$ は次のようになります。

$T$$X$$Y$
0000(())なし
0101()()
0110()()
1001()()
1010()()
1111なし(())
これらは合計で $6$ 個あるため、 $6$ を出力します。
サンプル2
入力
4
()()
出力
4

入力の文字列は B 型の正しいカッコ列です。

サンプル3
入力
2
()
出力
2

入力の文字列は A 型かつ B 型の正しいカッコ列です。

サンプル4
入力
40
(((((((((((((((((((())))))))))))))))))))
出力
88808106

$998244353$ で割った余りを出力してください。

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。