ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics

题解

题目大意 给你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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值