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 }