# 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: 1323
Case #3: 18221```

Source

``` 1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll mod=1e9+7;
5 const ll N=1e5+10;
6 ll fac[N]={1};
7 ll temp[27];
8 ll Hash[27];
9 bool leap[27];
10 char str[N];
11 struct Node
12 {
13     ll cnt[N];
14     ll id;
15     bool operator<(const Node &p)const
16     {
17         for(ll i=N-1;i>=0;i--)
18         {
19             if(cnt[i]>p.cnt[i])
20                 return true;
21             else if(cnt[i]<p.cnt[i])
22                 return false;
23             else;
24         }
25     }
26 }p[27];
27 int main()
28 {
29     ll n,tcase=1;
30     for(ll i=1;i<N;i++)
31         fac[i]=fac[i-1]*26%mod;
32     while(scanf("%lld",&n)!=EOF)
33     {
34         memset(p,0,sizeof(p));
35         memset(Hash,-1,sizeof(Hash));
36         memset(leap,false,sizeof(leap));
37         ll r=0;
38         for(ll i=1;i<=n;i++)
39         {
40             scanf("%s",str);
41             ll len=strlen(str);
42             r=max(r,len-1);
43             if(len!=1)
44                 leap[str[0]-'a']=1;
45             for(ll i=0;i<len;i++)
46                 p[str[i]-'a'].cnt[len-(i+1)]++;
47         }
48         for(ll i=0;i<26;i++)
49         {
50             for(ll j=0;j<N;j++)
51             {
52                 if(p[i].cnt[j]>=26)
53                 {
54                     p[i].cnt[j+1]+=p[i].cnt[j]/26;
55                     p[i].cnt[j]%=26;
56                 }
57             }
58             p[i].id=i;
59         }
60         sort(p,p+26);
61         for(ll i=0;i<26;i++)
62             Hash[p[i].id]=26-(i+1);
63         for(ll i=0;i<26;i++)
64         {
65             if(leap[p[i].id]&&Hash[p[i].id]==0)
66             {
67                 for(ll j=25;j>=0;j--)
68                 {
69                     if(!leap[p[j].id])
70                     {
71                         for(ll k=25;k>=j+1;k--)
72                         {
73                             Hash[p[k].id]=Hash[p[k-1].id];
74                         }
75                         Hash[p[j].id]=0;
76                         break;
77                     }
78                 }
79                 break;
80             }
81         }
82         ll ans=0;
83         for(ll i=0;i<26;i++)
84         {
85             for(ll j=0;j<N;j++)
86             {
87                 ans=(ans+fac[j]*p[i].cnt[j]*Hash[p[i].id]%mod);
88             }
89         }
90         printf("Case #%lld: %lld\n",tcase++,ans%mod);
91     }
92     return 0;
93 }```

0 条评论

## 相关文章

### 1200 同余方程

1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目...

2834

1583

1111

1453

### 深入理解计算机系统（2.6）------整数的运算

前面两篇博客我们详细讲解了计算机中整数的表示，包括有符号和无符号（补码编码）的详细介绍。那么这篇博客我们将对它们的运算有个详细的了解。 　　在讲解之前首先看...

2667

### 对vector等STL标准容器进行排序操作

STL几乎封装了所有的数据结构中的算法，从链表到队列，从向量到堆栈，对hash到二叉树，从搜索到排序，从增加到删除......可以说，如果你理解了STL，你会...

2612

1977

3225

### 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】

Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K...

2825

### Q70 Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time y...

3445