贪心,注意前导0
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const int MAXN=102000;
int arr[30][MAXN],b[30],nzero[30],mp[30];
char str[MAXN];
long long mxlen;
bool cmp(int x,int y)
{
for(int i=mxlen;i>=0;i--)
{
if(arr[x][i]!=arr[y][i])
return arr[x][i]<arr[y][i];
}
return 0;
}
int main()
{
long long n,i,j,ans,len,cas=1,tmp;
while(~scanf("%lld",&n))
{
memset(nzero,0,sizeof(nzero));
memset(arr,0,sizeof(arr));
mxlen=0;
for(i=1;i<=n;i++)
{
scanf(" %s",&str);
len=strlen(str);
mxlen=max(mxlen,len);
if(len!=1)
nzero[str[0]-'a']=1;
for(j=0;j<len;j++)
arr[str[j]-'a'][len-j-1]++;
}
mxlen+=1000;
for(i=0;i<26;i++)
{
for(j=0;j<mxlen;j++)
{
arr[i][j+1]+=arr[i][j]/26;
arr[i][j]%=26;
}
}
for(i=0;i<26;i++)
b[i]=i;
sort(b,b+26,cmp);
memset(mp,-1,sizeof(mp));
for(i=0;i<26;i++)
{
if(!nzero[b[i]])
{
mp[b[i]]=0;
break;
}
}
tmp=1;
for(i=0;i<26;i++)
{
if(mp[b[i]]!=0)
mp[b[i]]=tmp++;
}
ans=0;
for(i=0;i<26;i++)
{
tmp=1;
for(j=0;j<mxlen;j++)
{
ans=(ans+tmp*arr[i][j]%mod*mp[i]%mod)%mod;
tmp=tmp*26%mod;
}
}
printf("Case #%lld: %lld\n",cas++,ans);
}
}