【模拟】2017 Multi-University Training Contest 1 The Battle of Chibi

acm.hdu.edu.cn/showproblem.php?pid=5542

【Accepted】

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 
  8 using namespace std;
  9 typedef long long ll;
 10 const ll mod=1e9+7;
 11 const int maxn=1e5+2;
 12 char str[maxn];
 13 ll a[30][maxn];
 14 bool vis[30];
 15 int rk[30];
 16 int l[30]; 
 17 bool lower(int x,int y)
 18 {
 19     if(l[x]!=l[y]) return l[x]<l[y];
 20     for(int i=maxn-1;i>=0;i--)
 21     {
 22         if(a[x][i]!=a[y][i]) return a[x][i]<a[y][i]; 
 23     }
 24     return false;
 25 }
 26 int n;
 27 int main()
 28 {
 29     int cas=0;
 30     while(~scanf("%d",&n))
 31     {
 32         memset(a,0,sizeof(a));
 33         memset(vis,false,sizeof(vis));
 34         memset(l,0,sizeof(l));
 35         for(int i=0;i<n;i++)
 36         {
 37             scanf("%s",str);
 38             int len=strlen(str);
 39             int cnt=0;
 40             for(int k=len-1;k>=0;k--)
 41             {
 42                 a[str[k]-'a'][cnt++]++;
 43             }
 44             if(len!=1)
 45             {
 46                 vis[str[0]-'a']=true; 
 47             }
 48             
 49         }
 50         for(int i=0;i<26;i++)
 51         {
 52             for(int k=0;k<maxn-1;k++)
 53             {
 54                 a[i][k+1]+=(a[i][k]/26);
 55                 a[i][k]=a[i][k]%26;
 56             }
 57             rk[i]=i;
 58         }
 59         for(int i=0;i<26;i++)
 60         {
 61             for(int k=maxn-1;k>=0;k--)
 62             {
 63                 if(a[i][k]>0)
 64                 {
 65                     l[i]=k;
 66                     break;
 67                 }
 68             }
 69         }
 70         for(int i=0;i<26;i++)
 71         {
 72             for(int k=i+1;k<26;k++)
 73             {
 74                 if(lower(rk[k],rk[i]))
 75                 {
 76                     swap(rk[i],rk[k]);
 77                 }
 78             }
 79         }
 80         for(int i=0;i<26;i++)
 81         {
 82             if(!vis[rk[i]])
 83             {
 84                 int x=rk[i];
 85                 for(int k=i-1;k>=0;k--)
 86                 {
 87                     rk[k+1]=rk[k];
 88                 }
 89                 rk[0]=x;
 90                 break;
 91             }
 92         }
 93         ll ans=0;
 94         for(int i=1;i<26;i++)
 95         {
 96             ll now=1;
 97             ll num=0;
 98             for(int k=0;k<=l[rk[i]];k++)
 99             {
100                 num=(num+(ll)a[rk[i]][k]*now%mod)%mod;
101                 now=(now*26)%mod;
102             }
103             ans=(ans+i*num%mod)%mod;
104         }
105         printf("Case #%d: %d
",++cas,(int)ans);
106         
107     }
108     return 0;
109  } 
View Code
原文地址:https://www.cnblogs.com/itcsl/p/7239714.html