結果
| 問題 | No.3370 AB → BA |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-08 23:12:32 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,740 bytes |
| 記録 | |
| コンパイル時間 | 274 ms |
| コンパイル使用メモリ | 82,508 KB |
| 実行使用メモリ | 268,020 KB |
| 最終ジャッジ日時 | 2026-01-08 23:12:36 |
| 合計ジャッジ時間 | 4,085 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 1 |
| other | TLE * 1 -- * 19 |
ソースコード
import sys
MOD = 998244353
def main():
s = sys.stdin.readline().strip()
n = len(s)
# A va B lar pozitsiyalari
a_pos = []
b_pos = []
for i, ch in enumerate(s):
if ch == 'A':
a_pos.append(i)
else:
b_pos.append(i)
k = len(a_pos) # A lar soni
m = len(b_pos) # B lar soni
# A lar uchun DP
# dpA[x] = oxirgi A x pozitsiyada bo'lgan usullar soni
max_a = n # maksimal pozitsiya
dpA = [0] * (max_a + 1)
# Boshlang'ich: birinchi A uchun
if k > 0:
first_a_limit = a_pos[0] # x ≤ a_pos[0]
for x in range(first_a_limit + 1):
dpA[x] = 1
# Keyingi A lar uchun
for i in range(1, k):
new_dpA = [0] * (max_a + 1)
limit = a_pos[i]
# Prefix sum
prefix = 0
for x in range(max_a + 1):
prefix = (prefix + dpA[x]) % MOD
if x <= limit:
new_dpA[x] = prefix
dpA = new_dpA
# B lar uchun DP (o'ngdan chapga)
dpB = [0] * (max_a + 1)
if m > 0:
last_b_limit = b_pos[-1] # y ≥ b_pos[-1]
for y in range(last_b_limit, n):
dpB[y] = 1
# B lar uchun orqaga
for i in range(m - 2, -1, -1):
new_dpB = [0] * (max_a + 1)
limit = b_pos[i]
# Suffix sum
suffix = 0
for y in range(n - 1, -1, -1):
suffix = (suffix + dpB[y]) % MOD
if y >= limit:
new_dpB[y] = suffix
dpB = new_dpB
# Natijani hisoblash
result = 0
if k == 0:
# Faqat B lar bor
for i in range(n):
result = (result + dpB[i]) % MOD
elif m == 0:
# Faqat A lar bor
for i in range(n):
result = (result + dpA[i]) % MOD
else:
# A lar va B lar
# Har bir pozitsiya uchun: bu A bo'lishi yoki B bo'lishi mumkin
# Lekin A va B lar S dagi tartibda bo'lishi kerak
# S tartibida joylashish sharti
# X dagi har bir pozitsiya S dagi mos keladigan belgiga ega
# Oddiyroq yondashuv: kombinatorika
# A lar va B lar uchun mustaqil hisoblab, keyin ularni birlashtiramiz
total_a = sum(dpA) % MOD
total_b = sum(dpB) % MOD
# A lar va B lar joylashishi mumkin bo'lgan o'rinlar
# Har bir A va B uchun o'z pozitsiyasi bor
# A lar va B lar o'zaro joylashishi mumkin
# Aslida, masalani soddaroq hisoblash mumkin
# X dagi har bir belgi S dagi mos keladigan belgiga ega
# Shunday qilib, X dagi i-pozitsiyadagi belgi S dagi i-pozitsiyadagi belgidan katta yoki teng bo'lishi kerak
# (A uchun chapga, B uchun o'ngga siljishi mumkin)
# DP[i] = S ning birinchi i belgisiga mos X ning birinchi i belgisini joylashtirish usullari
dp = [0] * (n + 1)
dp[0] = 1
for i in range(n):
# X[i] da nima bo'lishi mumkin?
if s[i] == 'A':
# X[i] = A bo'lishi kerak
dp[i + 1] = dp[i]
else: # s[i] == 'B'
# X[i] = B bo'lishi kerak
dp[i + 1] = dp[i]
# Agar i > 0 va s[i-1:i+1] = "AB" bo'lsa, X[i-1] = B, X[i] = A bo'lishi mumkin
# Bu holda AB -> BA bo'lgan
if i > 0 and s[i-1] == 'A' and s[i] == 'B':
# X[i-1] = B, X[i] = A
# Bu holda (i-2) gacha bo'lgan istalgan joylashtirishdan keyin
dp[i + 1] = (dp[i + 1] + dp[i-1]) % MOD
result = dp[n]
print(result % MOD)
if __name__ == "__main__":
main()