1. 程式人生 > >Balala Power! HDU - 6034

Balala Power! HDU - 6034

char bre str efi 不能 pro tar truct sort

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 }
View Code

Balala Power! HDU - 6034