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

string reSort(string a) {
    char temp;
    for (int i = 0; i < a.size(); i++) {
        for (int j = i + 1; j < a.size(); j++) {
            if (a[i] > a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    return a;
}

char sw(char a) {
    char result;
    char A;
    if (islower(a)) {
        A = toupper(a);
    }
    else{
        A= a;
    }

    switch (A) {
        case '0':
            result = '0';
            break;
        case '1':
            result = '8';
            break;
        case '2':
            result = '4';
            break;
        case '3':
            result = 'C';
            break;
        case '4':
            result = '2';
            break;
        case '5':
            result = 'A';
            break;
        case '6':
            result = '6';
            break;
        case '7':
            result = 'E';
            break;
        case '8':
            result = '1';
            break;
        case '9':
            result = '9';
            break;
        case 'A':
            result = '5';
            break;
        case 'B':
            result = 'D';
            break;
        case 'C':
            result = '3';
            break;
        case 'D':
            result = 'B';
            break;
        case 'E':
            result = '7';
            break;
        case 'F':
            result = 'F';
            break;
        default:
            result = a;
    }
    return result;
}

int main() {
    string aIn;
    string bIn;
    string str;
    getline(cin, aIn, ' ');
    getline(cin, bIn);
    str = aIn + bIn;
    int as;
    int bs;
    if (str.size() % 2 == 0) {
        as = str.size() / 2;
        bs = str.size() / 2;
    } else {
        as = (str.size() + 1) / 2;
        bs = (str.size() - 1) / 2;
    }
    string a(as, ' ');
    string b(bs, ' ');
    for (int i = 0; i < str.size(); i++) {
        if (i % 2 == 0) {
            a[i / 2] = str[i];
        } else {
            b[(i - 1) / 2] = str[i];
        }
    }

    a = reSort(a);
    b = reSort(b);

    for (int i = 0; i < str.size(); i++) {
        if (i % 2 == 0) {
            str[i] = sw(a[i / 2]);
        } else {
            str[i] = sw(b[(i - 1) / 2]);
        }
    }

    cout << str << endl;
}

不难但是非常绕一道题。2进制翻转转化我觉得没必要再专门搞一套算法去算了,直接穷举吧)

标记几个易错点:

string的大小一定要提前分配好,不然存不下去的

字符串是按ASCII码进行重排序的,用冒泡排序写一个就好

奇数偶数位置一定弄清