【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6034

【Description】



给你n个字符串;

每个字符串都仅由小写字母组成;

然后,你可以把每个小写字母都映射成0..25中的任意一个数字;

(两个不同的字母不能映射成相同数字);

组成的26进制数;

问这n个26进制数的最大和是多少;

【Solution】



记录每个字母在哪一位上出现过多少次;

->其实就是记录每个字母在某些位权上的系数;

然后;

把占的位权总和最多的字母优先往前放就好;

可以用一个vector< int > v来完成比较的过程;

v的大小设置为MAXN=105;

这样就能记录每个字母在某一位上的位权了;

(最右边是最低位权,代表26^0)

这样就能按照类似字符串的比较方式进行比较了;

把大的字母放在前面即可;(没必要知道是哪个字母,直接乘上答案就好);

做的时候,每一位都要进位;

这样才能用字符串的比较方式进行比较;

直接用sort会超时;

用冒泡排序;

记录每个字母的最高位权;

如果最高位权不一样;

直接比较最高位权就好;

这样就没必要整个MAXN的vector都同时比较了;

因为不能有前导0;

所以在做的时候;

需要知道哪些字母是能够为0的;

(长度大于1的字符串的开头字母都不能为0)

做的时候,从最末尾开始,往前找最小的位权,且能够为0;把它放到末尾(表示替换成0);

然后再从后往前整体向左移动一位;

这样能保证合法的情况下最大;



【NumberOf WA】



10+



【Reviw】



贪心那一块没有好好想,错了好几次;

然后最高位权不相同直接判大小的优化也没有一开始就加;

挺挣扎的一道题吧.



【Code】

#include <vector>
#include <cstring>
#include <cstdio>
#define int long long
using namespace std;
const int MAXN =1e5+5;
const int INF = 0x3f3f3f3f;
const int M = 1e9+7;
struct node{
vector <int> v;
int ok,mi;
}ar[30];
bool cmp(node a,node b)
{
return a.v>b.v;
}
char s[MAXN];
int mm[MAXN];
int n; main()
{
//freopen("F:\\rush.txt","r",stdin);
//ios::sync_with_stdio(false);
mm[0] = 1;
for (int i = 1;i <= MAXN-1;i++)
mm[i] = (1LL*mm[i-1]*26)%M;
int ww = 0;
for (int i = 0;i <= 25;i++){
ar[i].v.resize(MAXN);
for (int j = 0;j <= MAXN-1;j++)
ar[i].v[j] = 0;
}
while(~scanf("%lld",&n))
{
for (int i = 0;i <= 25;i++){
for (int j = 0;j <= MAXN-1;j++)
ar[i].v[j] = 0;
ar[i].ok = 0;
ar[i].mi = INF;
}
while(n--)
{
scanf("%s",s);
int len = strlen(s);
if(len!=1)
ar[s[0]-'a'].ok=1;
for(int i=len-1,ji=MAXN-1;i>=0;i--,ji--)
{
int ind = s[i]-'a';
ar[ind].v[ji]++;
}
} for (int i = 0;i <= 25;i++){
for (int j = MAXN-1;j>=1;j--){
if (ar[i].v[j]>25){
ar[i].v[j-1]+=ar[i].v[j]/26;
ar[i].v[j]%=26;
}
}
for (int j = 0;j <= MAXN-1;j++)
if (ar[i].v[j]){
ar[i].mi = j;
break;
}
} bool ok = false;
while (!ok){
ok = true;
for (int i = 0;i <= 24;i++)
if (ar[i].mi > ar[i+1].mi || (ar[i].mi == ar[i+1].mi && ar[i].v < ar[i+1].v)){
swap(ar[i],ar[i+1]);
ok = false;
}
} int i;
for(i=25;i>=0;i--)
{
if(!ar[i].ok)break;
}
node temp = ar[i];
for (int j = i;j<=24;j++)
ar[j] = ar[j+1];
ar[25] = temp; int ans = 0;
for(int i=0,j=25;i<=25;i++,j--){
int temp = 0;
for (int k = 0,l = MAXN-1;k <= MAXN-1;k++,l--)
temp= (temp + (mm[l]*ar[i].v[k])%M)%M; ans = (ans + 1LL*temp*j%M)%M;
}
printf("Case #%lld: %lld\n",++ww,ans);
}
return 0;
}

【2017 Multi-University Training Contest - Team 1 1002】Balala Power!的更多相关文章

  1. 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  3. 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  4. 【2017 Multi-University Training Contest - Team 1 1011】KazaQ's Socks

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6043 [Description] 一个人壁橱里有n双袜子,每天早上取一双最小下标的袜子,然后晚上放 ...

  5. 【2017 Multi-University Training Contest - Team 1 1001】Add More Zero

    [Link]: [Description] 让你求最大的k; 使得 10^k<=2^m-1 [Solution] 求出2^m-1的位数就好; [lg(2^m-1)] = lg(2^m) = m* ...

  6. 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  7. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】

    Dying Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  9. 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】

    CSGO Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

随机推荐

  1. XMPP添加删除好友

    在现阶段的通信服务中.各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...

  2. 前端到后台ThinkPHP开发整站--php开发案例

    前端到后台ThinkPHP开发整站--php开发案例 总结 还是需要做几个案例,一天一个为佳,那样才能做得快. 从需求分析着手,任务体系要构建好,这样才能非常高效. 转自: 前端到后台ThinkPHP ...

  3. 2.mongoDB 介绍(特点、优点、原理)

    转自:https://www.cnblogs.com/hoojo/archive/2011/06/01/2066119.html 介绍:MongoDB是一个基于分布式文件存储的数据库.由C++语言编写 ...

  4. jquery-validator中js校验及标签校验的使用

    jquery-validator中js校验及标签校验的使用: 1.项目中引入jquery.validate.js  官方网站:http://bassistance.de/  http://jquery ...

  5. 那些不兼容 IE11的网站(持续更新)

    此博文用于收集不兼容 IE11 的网站,持续更新,请网站开发者自己认领: 兼容性引起的功能缺陷: v.qq.com (提示未安装 Flash 播放器,这问题我反馈几百年了,还没修复) tv.sohu. ...

  6. FragmentPagerAdapter和FragmentStatePagerAdapter的区别

    FragmentPagerAdapter 1:简单的介绍: 该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种:如果需要处理有很多页,并且数据动 ...

  7. MySql语句中select可以嵌套么,字段的重命名可以用中文么

    今天文档中看到的查询语句,SELECT后面又跟了一个SELECT嵌套,而且把字段重命名为中文,请问可以这样做么 MySql语句中select可以嵌套么,字段的重命名可以用中文么 >> my ...

  8. CF GYM 100781A(菊花图+直径)

    题目大意 给出若干颗树用最少的边把它们连成一个无向连通图,同时使图的直径最小.输出最小直径. 题解 我们定义树的半径为(树的直径+1)/2.符合题意的连接方式为.所有树的“中点”连在直径最长的树的中点 ...

  9. 前端之CSS选择器

    基本选择器 元素选择器 p {color: "red";} ID选择器 #i1 { background-color: red; } 类选择器 .c1 { font-size: 1 ...

  10. [USACO07DEC]道路建设Building Roads

    题目:洛谷P2872.POJ3625. 题目大意:给你n个点的坐标,有些点已经有边连通,现在要你连上剩下的所有点,求这些边的最小长度是多少(不包括原来的边). 解题思路:最小生成树,把所有边处理出来, ...