方法是申请一个长26位的数组,统计出每个字母的出现次数,然后从数组中依次弹出出现最多的次数,乘上尽可能大的权值。

#include<algorithm>
using namespace std;
int findMax(int * a){//每次弹出一个数组中的最大值。
    int max=0;
    int j=0;
    for(int i=0;i<26;i++){
        if(a[i]>=max){
            max=a[i];
            j=i;
        }
    }
    a[j]=0;
    return max;
}
int main(){
    int n;
    cin>>n;
    int a[26]={0};//统计每个字母出现的次数。
    string s;
    int i=0;
    int result=0;//存结果。
    while(i<n){
        cin>>s;
        for(int j=0;j<s.size();j++){
            a[s[j]-'a']+=1;
        }
        for(int k=0;k<s.size();k++){
            result+=findMax(a)*(26-k);
        }
        cout<<result<<endl;
        result=0;
        i++;
    }
}