結果
| 問題 | No.3500 01 String |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 01:23:36 |
| 言語 | Python3 (3.14.3 + numpy 2.4.4 + scipy 1.17.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,141 bytes |
| 記録 | |
| コンパイル時間 | 450 ms |
| コンパイル使用メモリ | 20,776 KB |
| 実行使用メモリ | 16,220 KB |
| 最終ジャッジ日時 | 2026-04-18 01:23:40 |
| 合計ジャッジ時間 | 3,606 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 2 |
| other | AC * 3 WA * 17 |
ソースコード
import sys
def solve():
input_data = sys.stdin.read().split()
if not input_data:
return
a = input_data[0]
n = len(a)
MOD = 998244353
# 1. 最初に出現する '0' と、最後に出現する '1' を探す
first_zero = a.find('0')
last_one = a.rfind('1')
# 2. '0' が存在しない、'1' が存在しない、または 0が1より後ろにしかない場合
# このときは文字列を変化させることができない
if first_zero == -1 or last_one == -1 or first_zero > last_one:
print(1)
return
# 3. 変化可能な範囲は [first_zero, last_one]
# この範囲内にある "01" という並びが、自由度を生む
ans = 1
count = 0
# 範囲内を走査して、連続する 0...1 の塊を数える
# 実際には、'0' が出た後に '1' が出る箇所の「隙間」を数え上げます
for i in range(first_zero, last_one):
if a[i] == '0' and a[i+1] == '1':
count += 1
# 各 01 ペアについて、その間をどう埋めるかが選択肢になる
# 正確には「0...1」という構造の数 + 1 が答えに関わります
# この問題のケースでは、(01の数 + 1) ではなく、
# 連続する「自由区間」の長さを用いた計算が適切です。
# --- 再修正方針 ---
# 実は、この問題は「0...1」となっている箇所の
# 01, 001, 011 などの「変化できる塊」を分離して考えます。
res = 1
free_zones = []
i = first_zero
while i < last_one:
if a[i] == '0':
# 0から始まる 0...1 の区間を探す
j = i
found_one = False
while j <= last_one:
if a[j] == '1':
found_one = True
if found_one and (j == last_one or a[j+1] == '0'):
# 0...1 のひと塊が終了
res = res * (j - i + 1) % MOD
i = j
break
j += 1
i += 1
print(res)
solve()