/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
作者:水木清华
2020-05-07
名字的漂亮度
*/
/*
解题思路:笨方法——用「钱」式思维来思考
名字的漂亮度,其实就是比谁的名字更值钱!
我们将名字的字母对应的「数字」作为它的价钱,
比如 26 最高,1 则最低,按大小顺序排布。
那么,我们要得到名字的最大可能「漂亮度」,
就要使得,越高频出现的字母,价钱越高。
Better than OK? 来!我们一起开始写代码!
*/
#include <iostream>
#include <algorithm>
using namespace std;
//计算名字的最大可能漂亮度(最高价钱)的函数接口
int MostValuableName (string Name) {
    int Alphabet[26] = {0}; //初始化一个数组,用于记录名字中不同字母出现的次数
    int Price[26] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; //初始化一个价钱表
    int MostValuable = 0; //初始化名字的最高价钱
    for (int i = 0; i < Name.size(); i++) {
        //大写字母的情况
        if (Name[i] >= 'A' && Name[i] <= 'Z') {
            Alphabet[Name[i] - 'A'] += 1; //累加字母的出现次数
        }
        //小写字母的情况
        else if (Name[i] >= 'a' && Name[i] <= 'z') {
        Alphabet[Name[i] - 'a'] += 1; //累加字母的出现次数
        }
    }
    sort(Alphabet, Alphabet + 26);
    for (int i = 0; i < 26; i++) {
        MostValuable += Alphabet[i] * Price[i]; //依次取高频字母,对应地,依次取高价钱;
        //正所谓「好货不便宜,便宜无好货」,哦,好像不对,
        //应该是卖得越多的货的价钱越高,就越赚钱!!!
    }
    return MostValuable; //返回一个名字的最大可能价钱(即漂亮度)
}
//计算多个名字的最大可能漂亮度(最高价钱)的函数接口
int MaximumPriceOfName (int Number) {
    string Name; //字符串形式的名字
    for (int i = 0; i < Number; i++) {
        cin >> Name; //输入名字
        cout << MostValuableName (Name) << endl; //输出名字的最大可能漂亮度
    }
    return 0;
}
//主函数
int main () {
    int N; //需要计算最大可能漂亮的名字个数
    while (cin >> N) {
        MaximumPriceOfName (N); //输出多个名字的最大可能漂亮度
    }
    return 0;
}