Balala Power!

时间限制: 4 Sec  内存限制: 128 MB

题目描述

Talented Mr.Tang has n strings consisting of only lower case characters. He wants to charge them with Balala Power (he could change each character ranged from a to z into each number ranged from 0 to 25, but each two different characters should not be changed into the same number) so that he could calculate the sum of these strings as integers in base 26 hilariously.

Mr.Tang wants you to maximize the summation. Notice that no string in this problem could have leading zeros except for string "0". It is guaranteed that at least one character does not appear at the beginning of any string.

The summation may be quite large, so you should output it in modulo 109+7.

输入

The input contains multiple test cases.

For each test case, the first line contains one positive integers n, the number of strings. (1≤n≤100000)

Each of the next n lines contains a string si consisting of only lower case letters. (1≤|si|≤100000,∑|si|≤106)

输出

For each test case, output "Case #x: y" in one line (without quotes), where x indicates the case number starting from 1 and y denotes the answer of corresponding case.

样例输入

1
a
2
aa
bb
3
a
ba
abc

样例输出

Case #1: 25
Case #2: 1323
Case #3: 18221
题意:给出 n个字符串,字符包括 a~z,分别给它们赋值 0~25,使得这些串表达成26进制时的和最大
官方题解:每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大。最大的数                    匹配 25,次大的数匹配 24,依次类推。排序后这样依次贪心即可,唯一注意的是不能出现前导 0。
思路:用二维数组num[ ] [ ],记录每个字母在哪一位出现了多少次,即num[字母] [出现的位数]=字母在位数出现的次数,另外用sum[ ]数组存储             字母的“贡献”,即sum[字母]=该字母的贡献,另外开一个数组ban[ ],来处理前导零问题,各个字符串统计好之后,根据每个字母的贡献              对字母进行排序(用num数组而不用sum数组),按着贪心思想,给字母分配权重,得出答案;
代码:
C++ Code 
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N = 100020;
const int Q = 1e9 + 7;
int n, L;
int num[26][N];          ///num[字母][该字母在的位数]=字母在该位出现的次数
int power[N], sum[N];    ///sum[字母]=该字母目前的贡献,pow[位数]=该位的贡献(26^x);
bool ban[26];            ///处理前导零

char str[N];
int a[26];

///根据在每位出现的次数进行排序,因为位数高的占的权重比较大,
///所以先从高位开始,按权重从小到大排序
bool cmp(int A, int B)
{
    for (int i = L - 1 ; i >= 0 ; -- i)
    {
        if (num[A][i] != num[B][i])
        {
            return num[A][i] < num[B][i];
        }
    }
    return 0;
}

void work()
{
    memset(num, 0, sizeof(num));
    memset(ban, 0, sizeof(ban));
    memset(sum, 0, sizeof(sum));
    L = 0;
    for (int i = 0 ; i < n ; ++ i)
    {
        scanf("%s", str);
        int len = strlen(str);

if (len > 1)
        {
            ban[str[0] - 'a'] = 1;///如果该字母在第一位,则ban[**]=1;
        }

reverse(str, str + len);///倒置数组

for (int j = 0 ; j < len ; ++ j)
        {
            ++ num[str[j] - 'a'][j];             ///该字母在j位出现的次数加一
            sum[str[j] - 'a'] += power[j];       ///该字母的贡献增加

if (sum[str[j] - 'a'] >= Q)

sum[str[j] - 'a'] =  sum[str[j] - 'a']%Q;
        }

L = max(L, len);
    }

///对每个字母出现的次数进行进位处理,(以26进制)
    for (int i = 0 ; i < 26 ; ++ i)
    {
        for (int j = 0 ; j < L ; ++ j)
        {
            num[i][j + 1] += num[i][j] / 26;
            num[i][j] %= 26;
        }

while (num[i][L])
        {
            num[i][L + 1] += num[i][L] / 26;
            num[i][L ++] %= 26;
        }
        a[i] = i;
    }
    ///排序
    sort(a, a + 26, cmp);
    int zero = -1;
    for (int i = 0 ; i < 26 ; ++ i)
    {
        ///找出贡献比较小,不在第一位的(可以为零),给它赋值为零,使最后结果最大
        if (!ban[a[i]])
        {
            zero = a[i];
            break;
        }
    }

int res = 0, x = 25;

for (int i = 25 ; i >= 0 ; -- i)
    {
        if (a[i] != zero)
        {
            res += (LL)(x --) * sum[a[i]] % Q;
            res %= Q;
        }
    }
    static int ca = 0;
    printf("Case #%d: %d\n", ++ ca, res);
}

int main()
{
    power[0] = 1;
    for (int i = 1 ; i < N ; ++ i)
    {
        power[i] = (LL)power[i - 1] * 26 % Q;  ///power[i]=26^i;
    }
    while (~scanf("%d", &n))
    {
        work();
    }
    return 0;
}

hdu-6034-Balala Power!相关推荐

  1. HDU 6034 - Balala Power! | 2017 Multi-University Training Contest 1

    /* HDU 6034 - Balala Power! [ 大数进位,贪心 ] 题意:给一组字符串(小写英文字母),将上面的字符串考虑成26进制数,每个字母分配一个权值,问这组数字加起来的和最大是多少 ...

  2. HDU 6034 Balala Power!

    题目内容 题意:就是给a~z之间的每个字母1个0~25之间的数,即为每个字母的权重(权重的分配依据于每个字母所做的贡献),相当于26进制数.求使所有字符串之和最大的值是多少? 贪心,将所有字母按照所做 ...

  3. (2017多校训练第一场)HDU - 6034 Balala Power! 贪心

    很容易就想到把每个字母的权重都算出来,然后把权重最大的赋值成25,次大的赋值成24......以此类推. 但是字符串长度最大为100000,也就是说一个字母的权重最大是26^100000次方左右,太大 ...

  4. hdu 6034 B - Balala Power! 贪心

    B - Balala Power! 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6034 题面描述 Talented Mr.Tang has n st ...

  5. HDU 2017 多校联赛 1002 Balala Power!

    题目描述 Talented Mr.Tang has n strings consisting of only lower case characters. He wants to charge the ...

  6. HDU6034 Balala Power!

    Balala Power! 这道题的题意就是给你n个字符串,让你对每个字符赋值(0~25)(注意,每种字符只能赋一个值),然后让你求这些字符的26进制的和的最大值,并且用十进制输出这个最大值. 解释一 ...

  7. hdu6304 Balala Power!

    http://acm.hdu.edu.cn/showproblem.php?pid=6034 基本的想法是统计出每个字母的贡献,然后贡献最小的就把更小的数字分给他 但这题关键在于贡献太大了,需要取模, ...

  8. HDU - 4461 The Power of Xiangqi

    题目链接 题意 给你两个人的象棋棋子,每个棋子对应一个防御值,如果一个人跑和马不全的话防御值减1.计算那个人的防御最高. AC #include <iostream> #include & ...

  9. HDU Integer's Power(容斥原理)

    题意 求[l,r]的最大指数和(1<=l,r<=10^18) 最大指数和(如64=8^2=4^3=2^6,所以64的最大指数和是6) 题解 很明显我们可以先求出[1,n]的最大指数和,然后 ...

  10. B - Balala Power!

    字符串的字典序可以看作为26进制数字的大小 坑点:大数比较大小需要注意 #include <bits/stdc++.h>using namespace std;typedef long l ...

最新文章

  1. MasterPage,Page 2者之间事件的执行顺序
  2. Ext.DomHelper类的使用示例(内容操作)
  3. Vue2.x 踩坑与总结
  4. windows下通过eclipse进行远程执行出错:Permission denied:
  5. smart模版学习笔记一
  6. Maven学习总结(45)——Maven仓库、将本地Jar包安装到仓库、打可执行的Jar总结
  7. Collections.sort new Compartor 用法
  8. 2022年武汉科技大学成人高等学历教育招生简章--学历提升、高起专、专升本
  9. 安卓pdf取词翻译软件_写论文,你应该知道这些好用的论文翻译软件!
  10. java二级大纲_计算机二级Java语言程序设计考试大纲
  11. 内网渗透(一)——本机信息收集
  12. ws2812b灯带容易坏_WS2812B灯带STC驱动
  13. 基于51单片机的智能温控风扇(程序+仿真+原理图)
  14. 判断手机横屏和竖屏方向
  15. java反序列化成object_java 反序列化输出 object获取为空的问题
  16. smartsvn的常见问题
  17. Unity3D windows平台视频录制录屏插件 UnityRecorder
  18. 借着谈转正感想的时机,再聊聊外企和互联网公司的工作体验
  19. ABB机器人机器人电路板电压检测法
  20. 如何“管理”自己的上级

热门文章

  1. 工信部郑昕:中小企业信息化要把握云计算契机
  2. RapidMiner数据挖掘
  3. 【最新程序设计赛】2022 GDE全球开发者大赛 #华为云 #¥1,290,000 #09.30开始
  4. 《简明量子力学》课堂整理
  5. 猿创征文|基于鲁棒控制理论的微电网优化调度(Matlab代码实现)
  6. 代码签名证书的时间戳验证码签名方法
  7. 关于彻底获得管理员权限的方法。(解决PYTHON PS 等报错问题)
  8. AT89C51驱动共阴极数码管的应用代码
  9. 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)
  10. Golang GVT