1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using ll = long long;
void solve() {
int n, q;
string s;
cin >> n >> q >> s;
set<int> BA, BC, CA, CB;
for (int i = 1; i <= q; ++i) {
char x, y;
cin >> x >> y;
if (x == 'b' && y == 'a') BA.insert(i);
else if (x == 'b' && y == 'c') BC.insert(i);
else if (x == 'c' && y == 'a') CA.insert(i);
else if (x == 'c' && y == 'b') CB.insert(i);
}
for (int i = 0; i < n; ++i) {
char c = s[i];
if (c == 'a') continue;
if (c == 'b') {
int tmp = 1e9;
vector<pair<set<int>*, int>> used;
if (!BA.empty()) {
int p = *BA.begin();
tmp = p;
used = { { &BA, p } };
}
else if (!BC.empty()) {
int p1 = *BC.begin();
auto it2 = CA.lower_bound(p1);
if (it2 != CA.end()) {
int p2 = *it2;
if (p2 < tmp) {
tmp = p2;
used = { { &BC, p1 }, { &CA, p2 } };
}
}
}
if (used.empty()) continue;
for (auto [st, pos] : used) st->erase(pos);
s[i] = 'a';
}
else {
int tmp = 1e9;
char t = 'c';
vector<pair<set<int>*, int>> used;
if (!CA.empty()) {
int p = *CA.begin();
tmp = p; t = 'a';
used = { { &CA, p } };
}
else if (!CB.empty()) {
int p1 = *CB.begin();
auto it2 = BA.lower_bound(p1);
if (it2 != BA.end()) {
int p2 = *it2;
if (p2 < tmp) {
tmp = p2; t = 'a';
used = { { &CB, p1 }, { &BA, p2 } };
}
}
}
if (t != 'a' && !CB.empty()) {
int p = *CB.begin();
tmp = p; t = 'b';
used = { { &CB, p } };
}
if (used.empty()) continue;
for (auto [st, pos] : used) st->erase(pos);
s[i] = t;
}
}
cout << s << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) solve();
return 0;
}
|