#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
using u8 = uint8_t;
using UF = array<u8, 26>;
u8 find(UF& uf, const u8 x) {
if (uf[x] != x)
{
uf[x] = find(uf, uf[x]);
}
return uf[x];
}
u8 const_find(const UF& uf, u8 x) {
while (uf[x] != x)
{
x = uf[x];
}
return x;
}
void merge(UF& uf, u8 a, u8 b) {
a = find(uf, a);
b = find(uf, b);
if (a < b)
{
uf[b] = a;
}
else if (b > a)
{
uf[a] = b;
}
}
char ch(u8 x) {
return static_cast<char>(x + 'a');
}
void print_uf(const UF& uf)
{
map<u8, vector<u8>> m;
for (u8 i = 0; i < uf.size(); ++i)
{
const auto f = const_find(uf, i);
if (f != i)
{
m[f].push_back(i);
}
}
for (const auto& [g, els] : m)
{
cout << ch(g) << ": \n";
for (const auto el : els)
{
cout << " " << ch(el) << "\n";
}
}
}
string smallestEquivalentString(string s1, string s2, string baseStr) {
UF uf;
iota(uf.begin(), uf.end(), 0);
for (int i = 0; i < s1.size(); ++i)
{
merge(uf, s1[i] - 'a', s2[i] - 'a');
}
merge(uf, 'p' - 'a', 'm' - 'a');
print_uf(uf);
for (auto& c : baseStr)
{
c = find(uf, c - 'a') + 'a';
}
return baseStr;
}
};
int main() {
auto sol = Solution{};
auto res = sol.smallestEquivalentString("parker", "morris", "parser");
cout << res << endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIHVzaW5nIHU4ID0gdWludDhfdDsKICAgIHVzaW5nIFVGID0gYXJyYXk8dTgsIDI2PjsKCiAgICB1OCBmaW5kKFVGJiB1ZiwgY29uc3QgdTggeCkgewogICAgICAgIGlmICh1Zlt4XSAhPSB4KQogICAgICAgIHsKICAgICAgICAgICAgdWZbeF0gPSBmaW5kKHVmLCB1Zlt4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1Zlt4XTsKICAgIH0KCiAgICB1OCBjb25zdF9maW5kKGNvbnN0IFVGJiB1ZiwgdTggeCkgewogICAgICAgIHdoaWxlICh1Zlt4XSAhPSB4KQogICAgICAgIHsKICAgICAgICAgICAgeCA9IHVmW3hdOwogICAgICAgIH0KICAgICAgICByZXR1cm4geDsKICAgIH0KCiAgICB2b2lkIG1lcmdlKFVGJiB1ZiwgdTggYSwgdTggYikgewogICAgICAgIGEgPSBmaW5kKHVmLCBhKTsKICAgICAgICBiID0gZmluZCh1ZiwgYik7CgogICAgICAgIGlmIChhIDwgYikKICAgICAgICB7CiAgICAgICAgICAgIHVmW2JdID0gYTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYiA+IGEpCiAgICAgICAgewogICAgICAgICAgICB1ZlthXSA9IGI7CiAgICAgICAgfQogICAgfQogICAgCiAgICBjaGFyIGNoKHU4IHgpIHsKICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oeCArICdhJyk7CiAgICB9CgogICAgdm9pZCBwcmludF91Zihjb25zdCBVRiYgdWYpCiAgICB7CiAgICAgICAgbWFwPHU4LCB2ZWN0b3I8dTg+PiBtOwogICAgICAgIGZvciAodTggaSA9IDA7IGkgPCB1Zi5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGF1dG8gZiA9IGNvbnN0X2ZpbmQodWYsIGkpOwogICAgICAgICAgICBpZiAoZiAhPSBpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtW2ZdLnB1c2hfYmFjayhpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChjb25zdCBhdXRvJiBbZywgZWxzXSA6IG0pCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8IGNoKGcpIDw8ICI6IFxuIjsKICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGVsIDogZWxzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICIgICIgPDwgY2goZWwpIDw8ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgc3RyaW5nIHNtYWxsZXN0RXF1aXZhbGVudFN0cmluZyhzdHJpbmcgczEsIHN0cmluZyBzMiwgc3RyaW5nIGJhc2VTdHIpIHsKICAgICAgICBVRiB1ZjsKICAgICAgICBpb3RhKHVmLmJlZ2luKCksIHVmLmVuZCgpLCAwKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzMS5zaXplKCk7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIG1lcmdlKHVmLCBzMVtpXSAtICdhJywgczJbaV0gLSAnYScpOwogICAgICAgIH0KCiAgICAgICAgbWVyZ2UodWYsICdwJyAtICdhJywgJ20nIC0gJ2EnKTsKICAgICAgICBwcmludF91Zih1Zik7CgogICAgICAgIGZvciAoYXV0byYgYyA6IGJhc2VTdHIpCiAgICAgICAgewogICAgICAgICAgICBjID0gZmluZCh1ZiwgYyAtICdhJykgKyAnYSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiYXNlU3RyOwogICAgfQp9OwoKaW50IG1haW4oKSB7CglhdXRvIHNvbCA9IFNvbHV0aW9ue307CglhdXRvIHJlcyA9IHNvbC5zbWFsbGVzdEVxdWl2YWxlbnRTdHJpbmcoInBhcmtlciIsICJtb3JyaXMiLCAicGFyc2VyIik7Cgljb3V0IDw8IHJlcyA8PCBlbmRsOwp9