HDU 6034 Balala Power!【排序/进制思维】

HDU 6034 Balala Power!【排序/进制思维】

大家好,又见面了,我是全栈君。

 

Balala Power!【排序/进制思维】

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 6703    Accepted Submission(s): 1680

Problem Description

HDU 6034 Balala Power!【排序/进制思维】


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 .

 
Input
The input contains multiple test cases.

For each test case, the first line contains one positive integers 
n , the number of strings. (1n100000
Each of the next n lines contains a string si consisting of only lower case letters. (1|si|100000,|si|106
 
Output
For each test case, output ”
Case #x : ” in one line (without quotes), where 
x indicates the case number starting from 1 and y denotes the answer of corresponding case.
 

 

Sample Input
1 a
2 aa bb
3 a ba abc

 
Sample Output
Case #1: 25
Case #2: 1323
Case #3: 18221
 
【题意】:给出n个字符串,对于字符a~z,赋值0~25,求在26进制下的最大值。
【分析】:

二十六
进制即为用二十六个字母替代从0到25的二十六个数字,与二进制,八进制,十进制,十六进制一样,二十六进制也可与其它进制法互相转换。

举例
例1:二十六进制转换为十进制过程。
以GWW为例,则为G(6)*26^2+W(22)*26^1+W(22)*26^0=4650
结果即为4650

注明:一般的二十六进制字母序数为:
A=0,Z=25
或A=1,Z=0

HDU 6034 Balala Power!【排序/进制思维】
HDU 6034 Balala Power!【排序/进制思维】

//官方:每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大。最大的数匹配 25,次大的数匹配 24···依次类推。
 
//题目要求字符串代表的26进制数之和最大,就要将高权值尽可能地赋给26进制数中在高位出现频率更高的字母,这样,问题就分成了三部分。第一,字母按价值排序;第二,字母赋值;第三,求和。

第一步,排序问题,为了方便比较,我们建立一个26*100000的数表,记录每个字母在每一位上的出现频数,从高位开始比较出现频数最高的字母赋值为25。在这里要注意到,因为有些字母可能会在某一位出现若干多次(超过26),这样该字母在本位上的价值可能会超过更高位上的字母价值,因此,我们运用数制进位的思想,将出现频数超过26的字母向上进位,这样就保证了在高位字母价值的绝对优势。在比赛时手动进行了字母排序,不仅耗费了大量的精力,而且最终超时了。赛后看标程,才深深地体会到cmp函数的神奇。

第二步,排序完成后,字母们整齐的码在一维数组里。按价值由高到低赋值即可。但是,还要注意前导0的问题,出现在字符串首的字母是不能被赋值为0的,在这里我们将价值最低且没有出现在字符串首的字母标记出来。然后将剩余的字母按价值赋值。

第三步,求和。即26进制转10进制。我的方法和标程略有差别,标程引入了sum[ ]数组,但是时间复杂度貌似差别不大,

另外,还有一些小细节。
1.计算26^n,用打表代替快速幂取模,可以大大降低时间复杂度
2.由于进位的问题,在字符串比较和进制转化时,注意要比最长字符串的长度ml再多比较一位。

题解

 

【代码】:

 

转载于:https://www.cnblogs.com/Roni-i/p/7821854.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107994.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker导出镜像命令_docker批量导出镜像

    docker导出镜像命令_docker批量导出镜像docker导出镜像docker导出镜像使用dockersave命令,可以使用dockersave–help查看用法为dcokersave[镜像名]:[TAG]-o[保存后文件名]-o,–output#输出为文件,后跟保存后的文件名[TAG]可以通过dockerimages查看示例…

    2022年9月6日
    2
  • Hystrix:服务熔断

    Hystrix:服务熔断文章目录服务雪崩服务雪崩​多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”,如果扇出的链路上某个微服务的调用响应时间过长,或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。​对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几十秒内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,

    2022年10月21日
    0
  • fvwm 4_FV7144TFATG

    fvwm 4_FV7144TFATG31.2.MiscellaneousCommands31.2.1.BugOptsBugOpts[option[bool]],…Thiscommandcontrolsseveralworkaroundsforbugsinthirdpartyprograms.Theindividualoptionsareseparated

    2022年10月3日
    0
  • Android开发:CompoundButton.onCheckedChangeListener和RadioGroup.onCheckedChangeListener冲突问题「建议收藏」

    Android开发:CompoundButton.onCheckedChangeListener和RadioGroup.onCheckedChangeListener冲突问题「建议收藏」在今天的开发工作当中,要同时用到ToggleButton和RadioGroup的监听事件,ToggleButton的监听事件需要导入CompoundButton.onCheckedChangeListener,RadioGroup的监听事件需要导入RadioGroup.onCheckedChangeListener,但是这两个导入是冲突的,而且这两个事件是必须用到的。怎么办呢?不要导入任何事件,在…

    2022年6月6日
    41
  • Silverlight 的 Isolated Storage 学习笔记

    Silverlight 的 Isolated Storage 学习笔记

    2021年7月29日
    54
  • mysql中exists的用法详解[通俗易懂]

    mysql中exists的用法详解[通俗易懂]前言在日常开发中,用mysql进行查询的时候,有一个比较少见的关键词exists,我们今天来学习了解一下这个exists这个sql关键词的用法,这样在工作中遇到一些特定的业务场景就可以有更加多样化的解决方案语法解释语法SELECTcolumn1FROMt1WHERE[conditions]andEXISTS(SELECT*FROMt2);说明括号中的子查询并不会返回具体的查询到的数据,只是会返回true或者false,如果外层sql的字段在子查询中存在则返回true,

    2022年10月23日
    0

发表回复

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

关注全栈程序员社区公众号