長さ2Nの文字列Sに対して、Q個のクエリを与えた後の文字列S’を出力する問題です。
提出
n = int(input())
s = list(input())
q = int(input())
flag = False
for i in range(q):
t, a, b = map(int, input().split())
if t == 1:
if flag:
if a = n:
a += n
b -= n
elif a >= n and b >= n:
a -= n
b -= n
sa = s[a-1]
sb = s[b-1]
s[a-1] = sb
s[b-1] = sa
else:
flag = not flag
ans = "".join(s)
if flag:
ans = ans[n:]+ans[:n]
print(ans)
T=2 のときに、前半N文字と後半N文字を入れ替える、とあるのですが、これをそのまま実装すると時間がかかってしまうため、工夫する必要があります。
ということで「flag」という変数を作って、反転していない状態を「False」、反転している状態を「True」として、今現在どの状態なのか分かるようにしておきます。
flag = not flag
とし、反転の処理を行います。
T=1 のときに、A文字目とB文字目を入れ替えます。
「flag=False」のときは反転していないので、そのままの入れ替えで問題ないです。
「True」のときは、単純に「A文字目とB文字目」とはならないので、何文字目なのかを計算します。
AがNより小さいときは、反転で「A+N」文字目となり、N以上のときは、反転で「A-N」文字目となります。
これをA,Bともに、場合分けして事前に計算しておき、A’文字目とB’文字目を入れ替えます。
(インデックスは0から始まるので、-1を忘れずに)
すべてのクエリを処理した後は、反転しているかどうかを判定して、「flag=True」の場合は、反転したものを出力します。