【五月份 -- 基础语法组】-- T2 -- 加密

· · 个人记录

https://cspjs.online/contest/688/problem/2

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;

string decode(const string& s) {
    vector<char> result;
    int i = 0;
    int n = s.size();

    while (i < n) {
        if (s[i] == '1') {
            if (i + 1 >= n)
                break;
            if (s[i + 1] == '1') {
                result.push_back('D');
                i += 2;
            } else {
                if (i + 2 >= n)
                    break;
                if (s[i + 1] == '0' && s[i + 2] == '0') {
                    result.push_back('F');
                    i += 3;
                } else if (s[i + 1] == '0' && s[i + 2] == '1') {
                    result.push_back('B');
                    i += 3;
                } else {
                    // 无效编码,跳过
                    i += 3;
                }
            }
        } else {
            if (i + 1 >= n)
                break;
            if (s[i + 1] == '0') {
                result.push_back('C');
                i += 2;
            } else {
                if (i + 2 >= n)
                    break;
                if (s[i + 2] == '1') {
                    result.push_back('E');
                    i += 3;
                } else {
                    result.push_back('A');
                    i += 3;
                }
            }
        }
    }

    return string(result.begin(), result.end());
}

string encode(const string& s) {
    vector<char> result;

    for (char ch : s) {
        char c = toupper(ch);
        switch (c) {
            case 'A':
                result.push_back('0');
                result.push_back('1');
                result.push_back('0');
                break;
            case 'B':
                result.push_back('1');
                result.push_back('0');
                result.push_back('1');
                break;
            case 'C':
                result.push_back('0');
                result.push_back('0');
                break;
            case 'D':
                result.push_back('1');
                result.push_back('1');
                break;
            case 'E':
                result.push_back('0');
                result.push_back('1');
                result.push_back('1');
                break;
            case 'F':
                result.push_back('1');
                result.push_back('0');
                result.push_back('0');
                break;
            default:
                // 忽略无效字符
                break;
        }
    }

    return string(result.begin(), result.end());
}

int main() {
    freopen("coding.in", "r", stdin);
    freopen("coding.out", "w", stdout);
    string s;
    cin >> s;

    if (s.empty()) {
        return 0;
    }

    if (s[0] == '0' || s[0] == '1') {
        cout << decode(s);
    } else {
        cout << encode(s);
    }

    return 0;
}