题解: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;
        }
    }
}