HDU6034(多校联合B题,25进制模拟)

来源:互联网 发布:阳光网络问政 编辑:程序博客网 时间:2024/06/06 17:12

题意
给出数字n,然后给出n个字符串,接下来给字母’a’-‘z’赋值,使这n个26进制数的和最大,注意不能有前导0;
模拟就行了,不过排序时要哈希一下
code:

#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int mod=1e9+7;int num[30][100020];int mark[30];int poww[100010];int ans[30];int len;bool cmp(int a,int b){    for(int i=len-1;i>=0;i--)    {        if(num[a][i]!=num[b][i])            return num[a][i]<num[b][i];    }    return 0;}int main(){    //freopen("1002.in ", "r", stdin);    //freopen("cuowu .out", "w", stdout);    poww[0]=1;    for(int i=1;i<100010;i++)    {        poww[i]=(ll)poww[i-1]*26%mod;        //cout<<poww[i]<<endl;    }    int n;    int kase=1;    while(scanf("%d",&n)!=EOF)    {        len=0;        int rate[30];        memset(num,0,sizeof(num));        memset(mark,0,sizeof(mark));        memset(ans,0,sizeof(ans));        memset(rate,-1,sizeof(rate));        while(n--)        {            char a[100010];            cin>>a;            if(len<strlen(a))                len=strlen(a);            int  le=strlen(a);            if(le>1)                mark[a[0]-'a']=1;            for(int i=le-1;i>=0;i--)            {                num[a[i]-'a'][le-1-i]++;                if(num[a[i]-'a'][le-i-1]>25)                {                    num[a[i]-'a'][le-i]+= num[a[i]-'a'][le-i-1]/26;                    num[a[i]-'a'][le-i-1]%=26;                }            }        }        for(int i=0;i<26;i++)        {            rate[i]=i;            while (num[i][len]>0)            {                num[i][len+1] += num[i][len] / 26;                num[i][len++] %= 26;            }        }        sort(rate,rate+26,cmp);        int zero =-1;        for(int i=0;i<26;i++)        {            if(mark[rate[i]]==0)            {                zero=rate[i];                break;            }        }        //cout<<zero<<endl;        int two=25;        for(int i=25;i>=0;i--)        {            if(rate[i]==zero)                continue;            ans[rate[i]]=two--;        }        ll res=0;        for(int i=len-1;i>=0;i--)        {            for(int j=0;j<26;j++)            {                res+=(((ll)ans[j]*(ll)num[j][i])%mod*(ll)poww[i])%mod;                res=res%mod;            }        }        res=res%mod;        printf("Case #%d: %lld\n",kase++,res);    }    return 0;}