题解:UVA468 Key to Success

· · 题解

思路:

先用一个结构体存储分别存储两个字符串中每个字符出现的次数,接着按次数从大到小排序,最后用 map 一一对应即可。

代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
    char x;//存储字符
    int cnt;//存储次数
}a1[1010],b1[1010];
int t,na,nb;
string a,b;
bool cmp(node u,node v) {
    return u.cnt>v.cnt;
}
int main() {
    cin >> t;
    while (t--) {
        cin >> a >> b;
        int f[1010]={0};//记录每个字符在数组中的下标
        for (int i=0;i<a.size();i++) {
            if (!f[int(a[i])]) {
                a1[++na].x=a[i];
                a1[na].cnt=1;
                f[int(a[i])]=na;
            }
            else {
                a1[f[int(a[i])]].cnt++;
            }
        }//统计a中每个字符出现的字数
        memset(f,0,sizeof(f));
        for (int i=0;i<b.size();i++) {
            if (!f[int(b[i])]) {
                b1[++nb].x=b[i];
                b1[nb].cnt=1;
                f[int(b[i])]=nb;
            }
            else {
                b1[f[int(b[i])]].cnt++;
            }
        }//统计b中每个字符出现的字数
        sort(a1+1,a1+na+1,cmp);//排序
        sort(b1+1,b1+nb+1,cmp);
        map<char,char> m;
        for (int i=1;i<=na;i++) {
            m.insert({b1[i].x,a1[i].x});//一一对应
        }
        for (int i=0;i<b.size();i++) {
            cout <<m[b[i]];
        }
        if (t!=0) cout <<"\n\n";//最后一个不能输出换行
    }
    return 0;
}