結果
| 問題 | No.2279 OR Insertion | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-09 21:06:27 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 512 ms / 2,000 ms | 
| コード長 | 2,295 bytes | 
| コンパイル時間 | 153 ms | 
| コンパイル使用メモリ | 82,540 KB | 
| 実行使用メモリ | 78,088 KB | 
| 最終ジャッジ日時 | 2025-04-09 21:08:33 | 
| 合計ジャッジ時間 | 14,782 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 48 | 
ソースコード
MOD = 998244353
n = int(input())
s = list(input())
result = 0
max_k = n - 1  # since k+1 <=n implies k <=n-1
pow2_nminus1 = pow(2, n-1, MOD)
for k in range(0, max_k + 1):
    # Compute allowed splits for this k
    dp = [0] * (n + 1)
    dp[0] = 1
    pre = [0] * (n + 1)
    pre[0] = 1
    for i in range(1, n + 1):
        if i < k + 1:
            # All j <i are considered (since i-j <k+1)
            dp_i = pre[i-1]
        else:
            # sum1 = j >=i-k
            sum1 = (pre[i-1] - (pre[i - k - 1] if (i - k -1) >=0 else 0)) % MOD
            # sum2 = j <=i-k-1 and S[i-k-1] == '0'
            idx = i - k -1 -1  # because i is 1-based, s is 0-based, and the position is i -k -1 is for the current part ending at i-1
            if i -k -1 -1 <0:  # i-k-1 is 0-based in S
                char = '0'
            else:
                char = s[i - k -1 -1]  # because i-k-1 is the position in the part's binary number that determines the bit
            # original code may have a mistake here:
            # wait for substring j..i-1 (i is 1-based), which has length l = i-1 -j +1 =i-j
            # correct position is i-1 - k -1? No, for k-th bit, the position in the original string is (i-1 -k)
            # wait when j..i-1 is the substring, the index in the substring that contributes to the k-th bit is (l-1 -k), l =i-j
            # So the position in original string is j + (l-1 -k) =j + (i-j-1 -k) = i-1 -k.
            # So i-1 -k is the correct index in s
            # So the code should check s[i-1 -k]
            # i is 1-based. when processing i, it's first i characters (0..i-1 in s)
            # so for substring j..i-1, the critical index is i-1 -k
            # which must be >=0
            if (i-1 -k) >=0 and (i-1 -k) < len(s):
                char = s[i-1 -k]
            else:
                char = '0'  # if out of bounds, not relevant
            if char == '0':
                sum2 = pre[i - k -1] % MOD
            else:
                sum2 = 0
            dp_i = (sum1 + sum2) % MOD
        dp[i] = dp_i % MOD
        pre[i] = (pre[i-1] + dp[i]) % MOD
    
    allowed = dp[n] % MOD
    total_splits = pow2_nminus1
    contr = (total_splits - allowed) * pow(2, k, MOD)
    contr %= MOD
    result = (result + contr) % MOD
print(result % MOD)
            
            
            
        