Balala Power!

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

Problem Description

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. (1≤n≤100000)

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: y" 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

题目链接:HDU 6034

嗯今天多校第一场的一道题由于不知道怎么地把cmp函数写炸了,最后就没写出来。很显然肯定是把最大的系数留给贡献最大的字母,因此贪心地把最大的系数从25-0依次赋值,然后再选取一个最小贡献且不是开头字母的来牺牲一下获得系数0,其他的字母就均不为0了。然后预处理一下26的指数即可,贡献怎么算?一开始按对贡献取模之后排序,后来发现取模之后的排肯定不对,然后用一个结构体记录每一个字母和它出现的位数以及次数,然后手动模拟进位一下,否则比如第0位出现100次肯定比第1位出现1次贡献大(此处要注意可能会进位到maxlen处,比较的时候要多一位,否则WA),最后写一个比较奇怪的cmp函数就可以了,这样就可以正常地排序比较。

代码:

#include <stdio.h>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <string>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 1e5 + 7;
const LL mod = 1e9 + 7;
LL fac[N];
char s[N];
int ishead[30], maxlen; struct info
{
char c;
LL val;
int f[N];
void init()
{
val = 0LL;
CLR(f, 0);
}
void cal()
{
for (int i = 0; i < maxlen; ++i)
{
if (f[i] >= 26)
{
f[i + 1] += f[i] / 26;
f[i] %= 26;
}
}
}
bool operator<(const info &rhs)const
{
for (int i = maxlen; i >= 0; --i)
{
if (f[i] != rhs.f[i])
return f[i] < rhs.f[i];
}
}
};
info arr[26]; void init()
{
CLR(ishead, 0);
maxlen = 0;
for (int i = 0; i < 26; ++i)
arr[i].init();
}
int main(void)
{
int i, j, n;
fac[0] = 1LL;
for (i = 1; i < N; ++i)
fac[i] = fac[i - 1] * 26LL % mod;
int q = 1;
while (~scanf("%d", &n))
{
init();
for (i = 0; i < n; ++i)
{
scanf("%s", s);
int len = strlen(s);
if (len > 1)
ishead[s[0] - 'a'] = 1;
if (len > maxlen)
maxlen = len;
for (j = 0; j < len; ++j)
{
int id = s[j] - 'a';
arr[id].val = (arr[id].val + fac[len - j - 1]) % mod;
++arr[id].f[len - j - 1];
}
}
for (i = 0; i < 26; ++i)
{
arr[i].c = 'a' + i;
arr[i].cal();
}
int sw = 0;
for (i = 0; i < 26; ++i)
{
if (!ishead[arr[i].c - 'a'] && arr[i] < arr[sw])
sw = i;
}
swap(arr[0], arr[sw]);
sort(arr + 1, arr + 26);
LL ans = 0;
for (i = 0; i < 26; ++i)
{
ans = ans + (arr[i].val * (LL)(i)) % mod;
ans %= mod;
}
printf("Case #%d: %I64d\n", q++, ans);
}
return 0;
}

HDU 6034 Balala Power!(贪心+排序)的更多相关文章

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

    Balala Power![排序/进制思维] Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java ...

  2. HDU 6034 Balala Power! (贪心+坑题)

    题意:给定一个 n 个字符串,然后问你怎么给 a-z赋值0-25,使得给定的字符串看成26进制得到的和最大,并且不能出现前导0. 析:一个很恶心的题目,细节有点多,首先是思路,给定个字符一个权值,然后 ...

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

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

  4. 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 ...

  5. 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)

    题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...

  6. hdu 6034 Balala Power!

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

  7. HDU 6034 Balala Power! —— Multi-University Training 1

    Talented Mr.Tang has nn strings consisting of only lower case characters. He wants to charge them wi ...

  8. hdu 6034 B - Balala Power! 贪心

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

  9. 6034 Balala Power! (17多校)

    题目大意:给出的字符串,每个字符建立一种与0-25的对应关系.然后每个字符串看成是一个26进制的数.问能获得的数的总和的最大值.(最后对1e9+7取模). 题目思考:把每个字符的贡献值看做一个26进制 ...

随机推荐

  1. Webpack4 学习笔记四 暴露全局变量、externals

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack 暴露全局变量 通过 expose-loader 内联配置 在 webpack中配置 每个模块通过注入的方式 通过CD ...

  2. 【模板时间】◆模板·I◆ 倍增计算LCA

    [模板·I]LCA(倍增版) 既然是一篇重点在于介绍.分析一个模板的Blog,作者将主要分析其原理,可能会比较无趣……(提供C++模板) 另外,给reader们介绍另外一篇非常不错的Blog(我就是从 ...

  3. python基础数据类型之字符串操作

    1.字符串切片ps:字符串是不可变的对象, 所以任何操作对原字符 是不会有任何影响的 s1 = "python最简洁" print(s1[0]) print(s1[1]) prin ...

  4. Zeppelin interperter 模式设置总结图解2

    该配置是在zeppelin的Interpreter的后台配置文件:conf/Interpreter.json spark Interpreter的模块定义那里.特别感谢开发团队组长大神的提示,深入挖掘 ...

  5. php扩展开发-常量

    //常量在内核中的结构 typedef struct _zend_constant { zval value; int flags; char *name; uint name_len; int mo ...

  6. Android内购订单验证 --- php实现

    直接上代码: function googleVerify($sdata,$google_public_key) { $sdata = json_decode($sdata,true); $in_app ...

  7. day1_作业2(三级菜单)--改进版

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- province={ '江苏省':{ '南京市':['秦淮区','玄武区','栖霞区'], '苏州市': ...

  8. Head First Java-图形化界面

    Head First Java是本挺好的书,讲的比较清楚和简单.主要看原则.概念啥的.语法什么的,还是靠谷歌吧:) 这部分的笔记也有很多了,最近会努力更新和搬运.顺便自己也重新读一下. 就酱.想要这本 ...

  9. 第二章习题 C++

    1.编写一个程序,显示您的姓名和地址. #include<iostream> using namespace std; int main() { ]; cout << &quo ...

  10. パラメータID一覧

    名称 内容 ABK 処理グループ. AUF 受注伝票タイプ. AVE FI:支払明細通知書のテンプレート登録. BAR 伝票タイプ. BNK 銀行コード. BUK 会社コード. CAC 管理領域. D ...