【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. 公布Qt Widgets桌面应用程序的方法

    公布Qt Widgets桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它能够在桌面.移动平台以及嵌入式平台上执行.眼下Qt 5介绍程序公布的文章帖子比較少.大家又很想要知道怎样公布Qt应用程序, ...

  2. vim水平摆放全部窗体的三个方法

    Method1: map <F7> <ESC>:windo exe "normal \<foobar<C-W>C-W>K"<C ...

  3. 使用isolation forest进行dns网络流量异常检测

    代码如下,测试发现,是否对输入数据进行归一化/标准化对于结果没有影响: import numpy as np from sklearn.ensemble import IsolationForest ...

  4. POJ 3667 线段树+标记

    自从某次考试写线段树写挂了以后 这是第一次写线段树,,,,,, 这是一个伤心的故事-- 题意: 思路: 标记 维护从左到右的最大值 从右到左的最大值 区间内的最大值-- 然后就一搞 就出来了 //By ...

  5. Kali linux2.0里Metasploit的服务类型探测

    不多说,直接上干货! 在MSF终端中,可以输入search name:_version命令查看所有可用的服务查点模块 该命令的执行结果如下: root@kali:~# msfconsole ..... ...

  6. CUDA还未产出,又要出北洋多元统计习题集

    其实目前是自己摸清了一个套路.genome realign的算法,以及CUDA的写法都已经有数了,前两天也弄完了关静的所有任务.但是今天关静早上一上来就宣布一个重磅消息:除了全学期的作业和期末论文,另 ...

  7. WLAN STA/AP 并发

    WLAN STA/AP 并发 Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能.对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 ( ...

  8. 栈 <stack> F - 宋飞正传

    I’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple prob ...

  9. EXPIREAT

    EXPIREAT key timestamp EXPIREAT 的作用和EXPIRE类似,都用于为key设置生存时间. 不同在于EXPIREAT命令接受都时间参数是UNIX时间戳(unix times ...

  10. C#调用C/C++动态库,封装各种复杂结构体

    C#调用C/C++动态库,封装各种复杂结构体. 标签: c++结构内存typedefc# 2014-07-05 12:10 6571人阅读 评论(1) 收藏 举报  分类: C(8)  C#(6)  ...