首页 > 其他 > 详细

hdu 6034

时间:2017-07-26 11:13:31      阅读:266      评论:0      收藏:0      [点我收藏+]

题意:给出n个字符串,每个字母可以代表0--25,问这些数字最大的26进制和是多少,不能有前导0,不同字母代表不同数字

思路:每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大。最大的数匹配 25,次大的数匹配 24,依次类推。排序后这样依次贪心即可,唯一注   意的是不能出现前导 0。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+1010;
 5 const ll mod=1e9+7;
 6 
 7 char a[N];
 8 int b[N][30],vis[30];
 9 struct node{
10     string s;
11     int id;
12 }d[30];
13 bool cmp(node p,node q){
14     if(p.s.size()==q.s.size()) return p.s<q.s;
15     return p.s.size()<q.s.size();
16 }
17 int main(){
18     int n;
19     int k=1;
20     while(scanf("%d",&n)!=EOF){
21             memset(vis,0,sizeof(vis));
22     memset(b,0,sizeof(b));
23         for(int i=1;i<=n;i++){
24             scanf("%s",a+1);
25             if(strlen(a+1)>1) vis[a[1]-a]=1;
26             int x=0;
27             for(int j=strlen(a+1);j>=1;j--){
28                 b[x++][a[j]-a]++;
29             }
30         }
31         for(int i=0;i<26;i++){//每个字母的26进制规范//
32             for(int j=0;j<=10100;j++){
33                 if(b[j][i]>=26){
34                     b[j+1][i]+=b[j][i]/26;
35                     b[j][i]%=26;
36                 }
37             }
38         }
39         for(int i=0;i<26;i++){
40             d[i].id=i;
41             d[i].s="";
42             for(int j=100100;j>=0;j--){
43                 if(b[j][i]){
44                     for(int kk=j;kk>=0;kk--){
45                         d[i].s+=(char)(b[kk][i]+0);
46                     }
47                     break;
48                 }
49             }
50         }
51         int now;
52         sort(d,d+26,cmp);
53 
54         for(int i=0;i<26;i++){
55             if(vis[d[i].id]==0) {now=i;break;}
56         }
57 
58         ll ss=1;
59         ll sum=0;
60         for(int i=0;i<26;i++){
61             if(i==now) {continue;}
62             ll kk=1;
63             ll ssum=0;
64             for(int j=0;j<=100100;j++){
65                 ssum=(ssum+(1LL*b[j][d[i].id])*kk)%mod;
66                 kk=(kk*26)%mod;
67             }
68             sum=(sum+ssum*ss+mod)%mod;
69             ss++;
70         }
71         printf("Case #%d: ",k++);
72         cout<<sum<<endl;
73     }
74     return 0;
75 }

 

hdu 6034

原文:http://www.cnblogs.com/hhxj/p/7238418.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!