注释很详细,直接上代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string get;
    while(cin>>get)
    {
        int sz=get.size();
        map<char, int> mp;//用来存放出现的字符以及其出现的次数
        for(int i=0;i<sz;i++)
        {
            if(mp.find(get[i])!=mp.end())
            {
                (mp.find(get[i])->second)++;
            }
            else
                mp.insert(pair<char, int> (get[i],1));
        }
        set<int> times;//用来存储当前字符串中字符出现个数的种类
        for(auto a:mp)
        {
            times.insert(a.second);
        }

        string ret;//作为最终的返回值

        for(auto b:times)
        {
             string factor;//按字典序接收出现重复次数相同的字符串
            for(auto a: mp)
            {
                if(a.second==b)
                {
                    factor+=a.first;//按照字典序进行追加
                }
            }
            //进行逆制,因为此时的输出顺序是从出现个数小的往大的出,最终结果需要逆制,
            //因此,提前逆制按字典序追加的字符串,最后输出时可以保证输出正确
            reverse(factor.begin(), factor.end());
            ret+=factor;//把当前结果追加到最终返回值后面
        }
        //将从小到大输出转化为从大到小输出,并保证输出次数相同字符按字典序输出,得到最终返回值
        reverse(ret.begin(), ret.end());
        cout<<ret<<endl;

    }

    return 0;
}