文件目录

#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;
}