考虑二十六个字母拆成二十六位,先使用 a 串,同时将变化插入异或线性基,然后用线性基将权值消到 0
#include <array>
#include <iostream>
#include <valarray>
#include <vector>
using namespace std;
int n;
string a;
string b;
array<int, 26> xxj;
array<int, 26> xxjp;
array<int, 26> xxjMask;
void Insert(int x, int idx) {
int mask = 0;
for (int i = 25; i > -1; i--) {
if (x & (1 << i)) {
if (!xxj[i]) {
xxj[i] = x;
xxjp[i] = idx;
xxjMask[i] = mask ^ (1 << i);
return;
}
x ^= xxj[i];
mask ^= xxjMask[i];
}
}
}
void Solve() {
cin >> n >> a >> b;
int cur = 0;
for (int i = 0; i < n; i++) {
int x = a[i] - 'a';
int y = b[i] - 'a';
cur ^= 1 << x;
Insert(1 << x ^ 1 << y, i);
}
int curMask = 0;
for (int i = 25; i > -1; i--) {
// cout << cur << ',' << xxj[i] << endl;
if (cur & (1 << i)) {
if (!xxj[i]) {
cout << "-1";
return;
}
curMask ^= xxjMask[i];
cur ^= xxj[i];
}
}
for (int i = 0; i < 26; i++) {
if (curMask & (1 << i)) {
a[xxjp[i]] = b[xxjp[i]];
}
}
cout << a;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Solve();
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号