第一场 hdu 6034 Balala Power!

第一场 hdu 6034 Balala Power!

Talented Mr.Tang has 109+7.

InputThe input contains multiple test cases. 

For each test case, the first line contains one positive integers y denotes the answer of corresponding case.Sample Input

1
a
2
aa
bb
3
a
ba
abc

Sample Output

Case #1: 25
Case #2: 1323
Case #3: 18221

题目大意:给出n行小写字母组成的字符串,字符串的每个字母有26进制表示并且字符串的第一个字符不能为0,求这n行字符串相加的和是多少??

解题思路:首先使用二维数组记录字符串的位置上的字符和一维数组第一个字符进行统计,然后用二维数组对结构体进行排序,从大到小将不是前导的字符赋值为0,从小到大对不是0的字符由25开始往0对字符进行赋值,最后对于二维数组进行计数,打印结果即可。

AC代码:

 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 const int eps=1e9+7;
 8 long long a[100005][30],flag[100005];
 9 char s[100005];
10 long long ans[30];
11 int step,num[30],cnt[30];
12 int cmp(int A,int B)
13 {
14     for(int i=step;i>=0;i--)
15     {
16         if(a[i][A]!=a[i][B])
17         return a[i][A]<a[i][B];
18     }
19     return A<B;
20 }
21 int main()
22 {
23     flag[0]=1;
24     for(int i=1;i<100003;i++)
25     flag[i]=(long long)(flag[i-1]*26)%eps;
26     int n,cas=0;
27     //freopen("1002.in","r",stdin);
28     //freopen("1002.out","w",stdout);
29     while(~scanf("%d",&n))
30     {
31         cas++;
32         memset(ans,0,sizeof(ans));
33         memset(cnt,0,sizeof(cnt));
34         memset(a,0,sizeof(a));
35         step=0;
36         for(int i=0;i<n;i++)
37         {
38             scanf("%s",s);
39             int len=strlen(s);
40             if(len>1)
41             cnt[s[0]-'a']=1;
42             reverse(s,s+len);
43             for(int j=0;j<len;j++)
44             {
45                 a[j][s[j]-'a']++;
46             }
47             step=max(step,len);
48         }
49         for(int i=0;i<26;i++)
50         {
51             for(int j=0;j<step;j++)
52             {
53                 a[j+1][i]+=a[j][i]/26;
54                 a[j][i]=a[j][i]%26;
55             }
56             while(a[step][i])
57             {
58                 a[step+1][i]+=a[step][i]/26;
59                 a[step][i]=a[step][i]%26;
60                 step++;
61             }
62             num[i]=i;
63         }
64         sort(num,num+26,cmp);
65         int zero=-1;
66         for(int i=0;i<26;i++)
67         {
68             if(!cnt[num[i]])
69             {
70                 zero=num[i];
71                 break;
72             }
73         }
74         int k=25;
75         for(int i=25;i>=0;i--)
76         {
77             if(zero!=num[i])
78             {
79                 ans[num[i]]=k;
80                 k--;
81             }
82         }
83         long long key=0;
84         for(int i=0;i<step;i++)
85         {
86             for(int j=0;j<26;j++)
87             {
88                 key=(key+(ans[j]*flag[i]*a[i][j]))%eps;
89             }
90         }
91         printf("Case #%d: %lld
",cas,key);
92     }
93     return 0;
94 }
View Code