题解:UVA468 Key to Success
思路
这道题可以记录下每个字符出现的频率,并按照频率进行排序,再用 map 存储每个字母对应的字母,最后将第二个字符串转换后输出即可。
注意:这道题细节很多,包括有大小写英文字母,如果最后一个字符串后只输出一个空行,否则输出两个空行等。
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
char letter;
int pl;
};
node numa[60], numb[60];
bool cmp(node x, node y){
return x.pl > y.pl;
}
int main(){
int t;
cin >> t;
while(t--){
memset(numa, 0, sizeof(numa));
memset(numb, 0, sizeof(numb));
string a, b;
cin >> a >> b;
for(int i = 1; i <= 52; i++){
if(i <= 26){
numa[i].letter = char('a' + i - 1);
numb[i].letter = char('a' + i - 1);
}
else{
numa[i].letter = char('A' + (i - 26) - 1);
numb[i].letter = char('A' + (i - 26) - 1);
}
}
for(int i = 0; i < a.length(); i++){
if(a[i] >= 'a' && a[i] <= 'z'){
numa[int(a[i] - 'a' + 1)].pl++;
}
else{
numa[int(a[i] - 'A' + 27)].pl++;
}
}
for(int i = 0; i < b.length(); i++){
if(b[i] >= 'a' && b[i] <= 'z'){
numb[int(b[i] - 'a' + 1)].pl++;
}
else{
numb[int(b[i] - 'A' + 27)].pl++;
}
}
sort(numa + 1, numa + 53, cmp);
sort(numb + 1, numb + 53, cmp);
map<char, char> turn;
for(int i = 1; i <= 52; i++){
if(numa[i].pl != 0 && numb[i].pl != 0){
turn[numb[i].letter] = numa[i].letter;
}
}
for(int i = 0; i < b.length(); i++){
cout << turn[b[i]];
}
cout << endl;
if(t != 0){
cout << endl;
}
}
}