题解
题目大意 给你n个编码要求解码m位字符 然后给你一串16进制(有大小写)的编码后的串 要求解码 解码成2进制后还有奇偶校验
题目输入范围不是很大 可以直接把所有16进制全部解码为二进制方便处理 然后STL直接暴力搞
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 10;
char s[MAXN * 4], p[MAXN];
char asc[20][10] = {
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
"1111"
};
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--)
{
map<string, char> mp;
int m, n;
cin >> m >> n;
string str;
int c;
for (int i = 0; i < n; i++)
{
cin >> c >> str;
mp[str] = c;
}
cin >> p;
for (int i = 0; p[i]; i++)
{
if (p[i] >= 'a' && p[i] <= 'f')
p[i] = p[i] - 'a' + 'A';
int e;
if (p[i] > '9')
e = p[i] - 'A' + 10;
else
e = p[i] - '0';
for (int j = 0; j < 4; j++)
s[i * 4 + j] = asc[e][j];
}
str = "";
for (int i = 0; s[i] && m; i++)
{
while (i % 9 == 0)
{
int cnt = 0;
for (int j = 0; j < 8; j++)
if (s[i + j] == '1')
cnt++;
if (!(cnt & 1) == s[i + 8] - '0')
break;
i += 9;
}
if (i % 9 == 8)
continue;
str.push_back(s[i]);
map<string, char>::iterator it = mp.find(str);
if (it != mp.end())
{
cout << it->second;
str = "";
m--;
}
}
cout << endl;
}
return 0;
}