题解:UVA468 Key to Success
ZhengHao6015 · · 题解
思路:
先用一个结构体存储分别存储两个字符串中每个字符出现的次数,接着按次数从大到小排序,最后用 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;
}