算法
(模拟、思维) $O(n + q)$
如果直接模拟题意的话必然超时,因为对于操作 2
来说复杂度是 $O(n)$
所以我们需要加速操作 2
,注意到每次都是交换前 $n$ 个字符和后 $n$ 个字符,所以我们可以开一个布尔变量 $ok$ 用来判断是否需要交换前后子串。
对于操作 2
来说,只需要翻转 ok
的奇偶性。
而对于操作 1
来说,除了需要交换 $s[a]$ 和 $s[b]$ 以外,在此之前还需要把 $a$ 和 $b$ 变动位置,如果当前的 $ok$ 为 true
的话,如果 $a < n$ 的话,那么 $a = a + n$,否则 $a = a - n$,对于 $b$ 同理。
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using std::cin;
using std::cout;
using std::string;
int main() {
int n;
cin >> n;
string s;
cin >> s;
int q;
cin >> q;
int ok = 0;
int n2 = n * 2;
rep(qi, q) {
int t, a, b;
cin >> t >> a >> b;
if (t == 1) {
--a; --b;
if (ok) a = (a + n) % n2;
if (ok) b = (b + n) % n2;
std::swap(s[a], s[b]);
}
else ok ^= 1;
}
if (ok) {
string s1 = s.substr(0, n);
string s2 = s.substr(n);
s = s2 + s1;
}
cout << s << '\n';
return 0;
}