問題概要
問題ページ
-
C - IPFL
問題ページへ移動する
問題文
長さ \(2N\) の文字列 \(S\) があります。
この文字列に対して \(Q\) 個のクエリが与えられます。\(i\) 番目のクエリでは \(3\) つの整数 \(T_i, A_i, B_i\) が与えられるので、以下の処理をします。
- \(T_i = 1\) のとき : \(S\) の \(A_i\) 文字目と \(B_i\) 文字目を入れ替える
- \(T_i = 2\) のとき : \(S\) の前半 \(N\) 文字と後半 \(N\) 文字を入れ替える(\(A_i, B_i\) の値は用いない)
例えば \(S\) がFLIP
のときにこのクエリを処理すると、\(S\) はIPFL
となる。
これら \(Q\) 個のクエリを与えられた順に全て処理した後の \(S\) を出力してください。
制約
- \(1 \le N \le 2 \times 10^5\)
- \(S\) は長さ \(2N\) の英大文字のみからなる文字列
- \(1 \le Q \le 3 \times 10^5\)
- \(T_i\) は \(1\) または \(2\)
- \(T_i = 1\) のとき、\(1 \le A_i \lt B_i \le 2N\)
- \(T_i = 2\) のとき、\(A_i = B_i = 0\)
問題の考察
ACコード
import sys
def solve():
input = sys.stdin.readline
mod = 10 ** 9 + 7
n = int(input().rstrip('\n'))
s = list(str(input().rstrip('\n')))
q = int(input().rstrip('\n'))
r_cnt = 0
for i in range(q):
t, a, b = list(map(int, input().rstrip('\n').split()))
a -= 1
b -= 1
if t == 1:
if r_cnt % 2 != 0:
a += n if a < n else - n
b += n if b < n else - n
s[a], s[b] = s[b], s[a]
else:
r_cnt += 1
print("".join(s) if r_cnt % 2 == 0 else "".join(s[n:] + s[:n]))
if __name__ == '__main__':
solve()