/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2020-03-23
字符串合并处理
*/
#include <iostream>
#include <algorithm>
using namespace std;
//字符串合并处理的函数接口
void Process_String(string str1, string str2, string strOutput)
{
    //字典法:只考虑 '0' 到 '9' ,'a' 到 'f','A' 到 'F' 的字符即可,其余字符不做改变,照原输出
    char Intput[] = {"0123456789abcdefABCDEF"}; //输入参照字典(数字 + 大小写字母)
//    int Output[] = "084c2a6e195d3b7f5d3b7f"; //输出参照字典(小写)
    char Output[] = {"084C2A6E195D3B7F5D3B7F"}; //输出参照字典(数字 + 大写字母)
    strOutput = str1 + str2; //合并两个字符串
    string odd_str; //下标为奇数的字符组成的字符串,奇数位字符串
    string even_str; //下标为偶数的字符串组成的字符串,偶数位字符串
    //根据字符在合并字符串中的次序,按字典序分奇数位、偶数位独立来排,但次序的奇偶性不变,即原来是奇数位,排序后还是奇数位
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            odd_str += strOutput[i];
        }
        else if (i % 2 == 1)
        {
            even_str += strOutput[i];
        }
    }
    sort(odd_str.begin(), odd_str.end()); //奇排序
    sort(even_str.begin(), even_str.end()); //偶排序
    //将按奇数位、偶数位排序后的字符再填回合并字符串 strOutput
    int j = 0; //奇数位字符串的下标
    int k = 0; //偶数位字符串的下标
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            strOutput[i] = odd_str[j];
            j++;
        }
        else if (i % 2 == 1)
        {
            strOutput[i] = even_str[k];
            k++;
        }
    }
    //对字符(符合字典 Input[])所代表的 16 进制的数进行 BIT 倒序的操作,并转换为相应的大写字符
    for (int i = 0; i < strOutput.size(); i++)
    {
        if ((strOutput[i] >= '0') && (strOutput[i] <= '9'))
        {
            strOutput[i] = Output[strOutput[i] - '0'];
        }
        else if ((strOutput[i] >= 'a') && (strOutput[i] <= 'f'))
        {
            strOutput[i] = Output[strOutput[i] - 'a' + 10];
        }
        else if ((strOutput[i] >= 'A') && (strOutput[i] <= 'F'))
        {
            strOutput[i] = Output[strOutput[i] - 'A' + 16];
        }
    }
    cout << strOutput << endl;
    return;
}
//主函数
int main()
{
    string str1, str2, strOutput;
    while (cin >> str1 >>str2)
    {
        Process_String(str1, str2, strOutput);
    }
    return 0;
}