/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
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;
}