Balala Power! HDU - 6034

Balala Power!

HDU - 6034

题意:给n个字符串,让你给每一个小写字母赋一个值(0到25),使得所有的字符串的总和最大。

把每一个字符串看作一个26进制的数

先统计每个字母在不同位置出现的次数,然后按出现次数的多少排序,出现的多的自然赋大的值

注意题目要求不能有前导零,所以排序后拍到最后的那个字母如果在某个字符串首位出现过,就要和前面的换一下

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int mod=1e9+7;
 5 const int maxn=1e5+10;
 6 const int maxe=1e6+10;
 7 int maxlen,n;
 8 struct Node{
 9     int id;
10     int cnt[maxn];
11     bool operator <(const Node &a)const{
12         for(int i=maxlen;i>=0;i--) if(cnt[i]!=a.cnt[i]) return  cnt[i]>a.cnt[i];
13         return 0;
14     }
15 }p[33];
16 ll base[maxn];
17 char s[maxe];
18 int st[maxn],ed[maxn];
19
20 int vis[33];
21 ll num[33];
22
23 int main(){
24     int kase=0;
25     base[0]=1;
26     for(int i=1;i<maxn;i++) base[i]=base[i-1]*26%mod;
27     maxlen=0;
28     while(scanf("%d",&n)!=EOF){
29         for(int i=0;i<26;i++){
30             vis[i]=0;
31             for(int j=0;j<=maxlen;j++) p[i].cnt[j]=0;
32             p[i].id=i;
33         }
34         int x=0;
35         for(int k=0;k<n;k++){
36             scanf("%s",s+x);
37             int len=strlen(s+x);
38             st[k]=x;
39             x+=len;
40             ed[k]=x;
41             for(int i=ed[k]-1,j=0;i>=st[k];i--,j++){
42                 if(i==st[k]) vis[s[i]-‘a‘]=1;
43                 int c=s[i]-‘a‘;
44                 p[c].cnt[j]++;
45             }
46         }
47         maxlen=0;
48         for(int i=0;i<26;i++){
49             for(int j=0;j<maxn-1;j++){
50                 p[i].cnt[j+1]+=p[i].cnt[j]/26;
51                 p[i].cnt[j]%=26;
52                 if(p[i].cnt[j]>0) maxlen=max(maxlen,j);
53             }
54         }
55         sort(p,p+26);
56         if(vis[p[25].id]){
57             int i;
58             for(i=25;i>=0;i--) if(vis[p[i].id]==0) break;
59             p[26]=p[i];
60             for(;i<26;i++) p[i]=p[i+1];
61         }
62         for(int i=0;i<26;i++) num[p[i].id]=25-i;
63         ll ans=0;
64         for(int i=0;i<n;i++){
65             int len=ed[i]-st[i];
66             for(int j=0;j<len;j++){
67                 ans=(ans+num[s[j+st[i]]-‘a‘]*base[len-j-1]%mod)%mod;
68             }
69
70         }
71         printf("Case #%d: %lld\n",++kase,ans);
72     }
73 }

时间: 2024-12-20 17:38:54

Balala Power! HDU - 6034的相关文章

HDU 6034 Balala Power!(贪心+排序)

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.

hdu 6034 Balala Power!

题目链接:hdu 6034 Balala Power! 题意: 给你n个字符串,都是包含小写字母,现在让你给a~z赋值0~25,使得这些字符串变成的26进制的数的总和最大. 不能有前导0的情况,他们保证至少有一个字母不出现在第一位. 题解: 每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大.最大的数匹配 25,次大的数匹配 24,依次类推.排序后这样依次贪心即可,唯一注意的是不能出现前导 0. 前导0的具体处理看代码. 1 #i

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

Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2668    Accepted Submission(s): 562 Problem Description Sample Input 1 a 2 aa bb 3 a ba abc Sample Output Case #1: 25 Case #2: 132

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 Talented Mr.Tang has n strings consisting of only lower case cha

Balala Power!(大数+思维)

Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 714    Accepted Submission(s): 117 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He

第一场 A Balala Power!

Talented Mr.Tang has nn strings consisting of only lower case characters. He wants to charge them with Balala Power (he could change each character ranged from a to zinto each number ranged from 0 to 25, but each two different characters should not b

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

题意:给定一个 n 个字符串,然后问你怎么给 a-z赋值0-25,使得给定的字符串看成26进制得到的和最大,并且不能出现前导0. 析:一个很恶心的题目,细节有点多,首先是思路,给定个字符一个权值,然后要注意的进位,然后排序,从大到小,给每个字符赋值,如果最后一个出现前导0,就得向前找一个最小的不在首字符的来交换,但不能动了相对的顺序. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <c

hdu 6034

http://acm.hdu.edu.cn/showproblem.php?pid=6034 首次参加多校训练,不得不说还是太菜了,弱爆了 这个题目在比赛的时候一直在想这个问题,怎么来记录它的权值,然后再用权值排序,想了很久都没能解决这个问题,最后结束了,看了一下题解 发现还是太菜了 题目:给你一些字符串,每个字符用0-25进行替换,要求转换成26进制后,总和最大 思路:首先转换成26进制也就是在位置上乘以26i然后加起来,由此可知字符串前面的字母用大的数字进行替换的话,那么总和加起来就会大,但

HDU 6034 【贪心】

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6034 题意: 给出 N 个字符串,要求我们对每个字符映射成 0~25中的一个数字,要求最后所有字符串转换为26进制能得到的最大值. 解题思路: 统计每个字符在每一位上得贡献(用数组模拟26进制),然后按照这个模拟得26进制诸位比较, 贪心映射: 但是注意一个点就是不能出现前缀 0  的情况,所以我们要标记哪种字符可以作为前缀0哪种不可以,排序完后处理一下不满足前缀 0 的情况,最后暴力答案即可: AC