ECNU OJ 3055 字符频率

设 26 个英文字母,每个字母都对应一个使用频率,同一个字母的大小写使用频率相同。

现给定一个由 26 个英文字母构成的字符串,请将字符串按照字母使用频率由大到小重排,使用频率大的字母排在前面,使用频率小的字母排在后面,如果使用频率相同则按照字母顺序表排列,小写字母排在大写字母前面,即 a->A->b->B->c->C-d->D->……->z->Z。

例如 :

26 个字母的使用频率如下表 :

A(a) B(b) C(c) D(d) E(e) F(f) G(g) H(h) I(i) J(j) K(k) L(l) M(m)
8.19 1.47 3.83 3.91 12.25 2.26 1.71 4.57 7.10 0.14 0.41 3.77 3.34
N(n) O(o) P(p) Q(q) R(r) S(s) T(t) U(u) V(v) W(w) X(x) Y(y) Z(z)
7.06 7.26 2.89 0.09 6.85 6.36 9.41 2.58 1.09 1.59 0.21 1.58 0.08

字符串 “Thisisaexample” 重排后为 “eeTaaiisshlmpx”

字符串 “AertrtsaBereDET” 重排后为 “eeeEttTaArrrsDB”。

Input

第 1 行:一个整数 T (1≤T≤10) 为问题数。

对于每个问题,有 2 行数据,按如下格式输入:

第 1 行输入 26 个浮点数,分别表示 26 个英文字母 A(a)~Z(z) 的使用频率;

第 2 行输入一个字符串,字符串长度不超过 100 个字符,字符串由 26 个英文字母构成。

Output

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出重排后的字符串。

#include <stdio.h>
#include <algorithm>
double p[27];

int cmp(const void * a, const void * b)
{
    char ch1, ch2; //待比较字符
    int p1, p2; //p1,p2 为ch1, ch2 在字母表中的序号
    ch1=*((char *)a);
    ch2=*((char *)b);
    if (ch1 >= 'a' && ch1 <= 'z') p1 = ch1 - 'a'; else p1 = ch1 - 'A';
    if (ch2 >= 'a' && ch2 <= 'z') p1 = ch2 - 'a'; else p2 = ch2 - 'A';
    
    if(p[p1] < p[p2])  return -1; // 按字母频率排序
    else if (p[p1] == p[p2])      // 字母使用频率相同
        if (p1 == p2)
            return ch2 - ch1; //相同字母,降序排列,即小写在大写前面
        else return p1 - p2; //不同字母,但使用频率相同,按字母表顺序排列
    else return 1;

}

int main (void)
{
    for (int i =0; i < 26; i++)
        scanf("%lf",&p[i]);
    char str[101];
    scanf("%s", str);
    
    qsort(str, strlen(str),sizeof(str[0]), cmp);
    printf("%s\n", str);
}

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注