#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int n, _2, len, a[25][25], trans[305], res[305];
string s;
map<char, int> mp;
map<int, char> m2;
struct node
{
int v, id;
} cnt[305];
int calc(char a, char b)
{ // 16进制转换10进制
return mp[a] * 16 + mp[b];
}
string back(int x)
{ // 10进制转换16进制
int a = x / 16, b = x % 16;
string res = "";
res += m2[b];
if(a != 0) res = m2[a] + res;
return res;
}
bool cmp(node x, node y)
{
if(x.v != y.v) return x.v > y.v;
return x.id < y.id;
}
int main()
{
for(char i = '0'; i <= '9'; i++)
mp[i] = i - '0';
for(char i = 'A'; i <= 'F'; i++)
mp[i] = 10 + i - 'A';
for(int i = 0; i <= 9; i++)
m2[i] = char(i + '0');
for(int i = 10; i <= 15; i++)
m2[i] = char(i - 10 + 'A');
for(int i = 1; i <= 256; i++)
cnt[i].id = i;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> s, len = s.size(), s = ' ' + s, _2 = len / 2;
for(int j = 1; j <= len; j += 2)
{
char x = s[j], y = s[j + 1];
a[i][(j + 1) / 2] = calc(x, y);
cnt[calc(x, y)].v++;
}
}
sort(cnt, cnt + 256, cmp);
for(int i = 0; i <= 15; i++)
if(back(cnt[i].id).size() == 1) cout << '0' << back(cnt[i].id);
else cout << back(cnt[i].id);
for(int i = 0; i <= 15; i++)
trans[cnt[i].id] = i;
cout << endl;
for(int i = 0; i <= 255; i++)
{
int cnt1 = -1, cnt2 = -1, ans;
for(int j = i; j >= 0; j--)
if(trans[j])
{
cnt1 = j;
break;
}
for(int j = i; j <= 255; j++)
if(trans[j])
{
cnt2 = j;
break;
}
if(cnt1 == -1) ans = trans[cnt2];
if(cnt2 == -1) ans = trans[cnt1];
if(i - cnt1 <= cnt2 - i) ans = trans[cnt1];
else ans = trans[cnt2];
res[i] = ans;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= _2; j++)
cout << m2[res[a[i][j]]];
cout << endl;
}
return 0;
}
样例不对,我的输出:
ABCFFF00CB09AC07101198011B6776FC
321632657CD16E
36469265ACC16D
B41632657FD16D
8F469265ACF14D
324F32657AD1FE
3246C245FC411D
BF4632687CD16D
8F469265ACC11D
B246326878D16E
83469265ACE11D
所有答案的0全部变成了6
求助,谢谢