結果
| 問題 | No.3587 Too Good to Swap |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-30 08:31:22 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 138 ms / 2,000 ms |
| コード長 | 2,121 bytes |
| 記録 | |
| コンパイル時間 | 227 ms |
| コンパイル使用メモリ | 95,844 KB |
| 実行使用メモリ | 108,288 KB |
| 最終ジャッジ日時 | 2026-07-10 20:56:42 |
| 合計ジャッジ時間 | 5,933 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 49 |
ソースコード
import sys
def solve():
# 入力を一括で読み込む
input_data = sys.stdin.read().split()
if not input_data:
return
Q = int(input_data[0])
out = []
idx = 1
for _ in range(Q):
S = input_data[idx]
T = input_data[idx+1]
idx += 2
# 1. 文字列の長さが異なる場合は No
if len(S) != len(T):
out.append("No")
continue
# 2. 構成する文字の個数が異なる場合は No
if sorted(S) != sorted(T):
out.append("No")
continue
# 3. 隔離状態 (Blocked) かどうかを判定する関数
def is_blocked(s):
# 'o' を除いた列を作成
non_o = [c for c in s if c != 'o']
if not non_o:
return False
try:
first_d = non_o.index('d')
except ValueError:
# 'd' が存在しない場合は隔離されない
return False
# 最初の 'd' より後に 'g' が存在するか確認 (g^A d^B の形か)
if 'g' in non_o[first_d:]:
return False
# 'g' が存在しない場合 (A = 0)
if first_d == 0:
return False
# 最後の 'g' のインデックスと、最初の 'd' のインデックスを取得
last_g_idx = s.rindex('g')
first_d_idx = s.index('d')
# 最後の 'g' と最初の 'd' の間にある 'o' の個数を計算
num_o = first_d_idx - last_g_idx - 1
# 'o' の個数が 3 個以上であれば隔離状態
return num_o >= 3
# S と T の隔離状態が一致していれば Yes、そうでなければ No
if is_blocked(S) == is_blocked(T):
out.append("Yes")
else:
out.append("No")
# 結果を一括出力
print('\n'.join(out))
if __name__ == '__main__':
solve()