結果
| 問題 | No.2219 Re:010 | 
| コンテスト | |
| ユーザー |  meruuu61779999 | 
| 提出日時 | 2023-02-17 22:11:00 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 56 ms / 2,000 ms | 
| コード長 | 803 bytes | 
| コンパイル時間 | 181 ms | 
| コンパイル使用メモリ | 82,404 KB | 
| 実行使用メモリ | 71,296 KB | 
| 最終ジャッジ日時 | 2024-07-19 13:21:03 | 
| 合計ジャッジ時間 | 2,116 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 21 | 
ソースコード
import sys
inputs = sys.stdin.readline
MOD = 998244353
"""再帰関数のときセット
sys.setrecursionlimit(10**7)
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
"""
def main():
    S = input()
    total_q = S.count('?')
    base_cnt = pow(2, total_q, MOD)
    half_cnt = pow(2, total_q - 1, MOD)
    rev2 = pow(2, MOD - 2, MOD)
    cnt_0 = 0
    cnt_01 = 0
    ans = 0
    for s in S:
        if s == '0':
            ans = (ans + cnt_01) % MOD
            cnt_0 = (cnt_0 + base_cnt) % MOD
        elif s == '1':
            cnt_01 = (cnt_01 + cnt_0) % MOD
        else:
            ans = (ans + cnt_01 * rev2 % MOD) % MOD
            cnt_01 = (cnt_01 + cnt_0 * rev2 % MOD) % MOD
            cnt_0 = (cnt_0 + half_cnt) % MOD
    print(ans)
if __name__ == '__main__':
    main()
            
            
            
        