AtCoder Beginner Contest Edit

【pythonでABC199を解説】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()

プログラミング

-AtCoder Beginner Contest, Edit
-