[AtCoder] ABC 199 C – IPFL

問題

方針

前半の文字と後半の文字をそれぞれ \( L, R \) とします.また,\( T_i = 2\) となる回数を数えて,偶奇によって操作を行う文字列を決定します.

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int N;
void swap(string& L, string& R, int A, int B) {
    if (B < N) {
        char t = L[A];
        L[A] = L[B];
        L[B] = t;
    } else if (A < N) {
        char t = L[A];
        L[A] = R[B - N];
        R[B - N] = t;
    } else {
        char t = R[A - N];
        R[A - N] = R[B - N];
        R[B - N] = t;
    }
}

int main() {
    int Q, T, A, B;
    string S;
    cin >> N >> S >> Q;
    string L = S.substr(0, N);
    string R = S.substr(N);
    int cnt = 0;
    for (int i = 0; i < Q; i++) {
        cin >> T >> A >> B;
        A--;
        B--;
        if (T == 1) {
            if (cnt % 2 == 0) {
                swap(L, R, A, B);
            } else {
                swap(R, L, A, B);
            }
        } else {
            cnt++;
        }
    }
    if (cnt % 2 == 0) {
        cout << L << "" << R << "\n";
    } else {
        cout << R << "" << L << "\n";
    }
    return 0;
}