MOD = 998244353 def count_possible(A: str) -> int: N = len(A) # dp0: 現在の位置までで、左から1伝播が「開いていない」状態の通り数 # dp1: 左から1伝播が「開いている」(次位置以降を1にできる)状態の通り数 dp0, dp1 = 1, 0 # 初期 (i=0 の前) for i in range(N): new_dp0 = 0 new_dp1 = 0 c = A[i] if c == '1': # 1の場合 # 状態0 (伝播なし) から: # - 広げない → 次状態0 # - 広げる → 次状態1 new_dp0 = (new_dp0 + dp0) % MOD new_dp1 = (new_dp1 + dp0) % MOD # 状態1 (すでに伝播中) から: # - 必ず1、伝播継続 → 次状態1 new_dp1 = (new_dp1 + dp1) % MOD else: # c == '0' # 0の場合 # 状態1 (左から1伝播中) から:強制的に1になる、伝播継続 new_dp1 = (new_dp1 + dp1) % MOD # 状態0 (伝播なし) から: # - 右に広げない → 次状態0 # - 右に広げる → 次に0を強制するが、状態としては「次で0固定」だがシンプルに # 実際はこのモデルでは0の右伝播は「次の状態に影響を与えない」形で扱う必要調整 new_dp0 = (new_dp0 + dp0) % MOD # 広げない場合 # 広げる場合も、現在の0は変わらず、次位置で0にできるが状態は0のまま(独立) new_dp0 = (new_dp0 + dp0) % MOD # 広げる選択 dp0, dp1 = new_dp0, new_dp1 return (dp0 + dp1) % MOD