#include <bits/stdc++.h>
using namespace std;
map<int, int> jm;
int n;
string s[30];
void init()
{
for (int i = '0'; i <= '9'; i++)
jm[i] = i - 48;
for (int i = 'A'; i <= 'F'; i++)
jm[i] = i - 65 + 10;
for (int i = 0; i <= 9; i++)
jm[i] = i + 48;
for (int i = 10; i <= 15; i++)
jm[i] = i + 65 - 10;
}
struct point
{
int color, num, id;
};
bool cmp1(point a, point b)
{
if (a.num == b.num)
return a.color < b.color;
return a.num > b.num;
}
vector<point> p;
map<int, int> mcolor;
map<int, int> ctoc;
void tjcolor()
{
for (int i = 0; i < n; i++)
{
string str = s[i];
for (int j = 0; j < str.size(); j += 2)
mcolor[jm[str[j]] * 16 + jm[str[j + 1]]]++; // 统计各种颜色值出现的次数
}
// 存入结构体进行排序
for (auto i : mcolor)
p.push_back({i.first, i.second, -1});
sort(p.begin(), p.end(), cmp1); // 按照出现次数排序并编号
for (int i = 0; i < 16; i++)
{
p[i].id = i;
int k = p[i].color;
// 还原颜色代码
putchar(jm[k / 16]);
putchar(jm[k % 16]);
}
cout << endl;
}
char finds2(int s)
{
int d = 300, ans = -1;
for (int i = 0; i < 16; i++)
{
int k = abs(s - p[i].color);
if (d > k)
{
d = k;
ans = i;
}
}
return jm[p[ans].id];
}
int main()
{
init(); // 初始化映射数据,字符-数字
cin >> n;
for (int i = 0; i < n; i++)
cin >> s[i];
tjcolor(); // 模拟处理过程
for (int i = 0; i < n; i++)
{
string str = s[i];
for (int j = 0; j < str.size(); j += 2)
cout << finds2(jm[str[j]] * 16 + jm[str[j + 1]]); // 按照已有字典,将原图颜色处理成对应压缩后颜色
cout << endl;
}
return 0;
}