C. Phase Shift
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, pre[N], nxt[N], fa[N];
string s;
int find(int u) {
return u == fa[u] ? u : fa[u] = find(fa[u]);
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T; cin >> T;
while (T--) {
cin >> n >> s;
for (int i = 0; i < 26; ++i) {
pre[i] = nxt[i] = -1, fa[i] = i;
}
int cnt = 26;
for (int i = 0; i < n; ++i) {
int c = s[i] - 'a';
if (~pre[c]) cout << char(pre[c] + 'a');
else {
for (int j = 0; j < 26; ++j) {
if (j == c || ~nxt[j]) continue;
if (cnt != 1 && find(c) == j) continue;
nxt[j] = c, pre[c] = j;
fa[j] = c, --cnt;
break;
}
cout << char(pre[c] + 'a');
}
}
cout << "\n";
}
return 0;
}
D. Meta-set
思路:是考虑末尾的那个元素,然后分类讨论了一车