• B Balala Power!


    Bryce1010模板

    这里写图片描述

    每个字母所在位置对应权值加和,肯定存不下。

    但我们只需要26个字母对应值之间的关系即可,开一个数组a[i][j]分别记录字母i在j这个位置上出现了多少次,对于大于26的值进位,这样我们就得到了26个字母对应的值对应的系数,按照字典序比较的方式去排序即可。

    但是要注意,题目虽然说一定有一个字母没有出现在最高位过,保证了一定存在合法的映射,(合法即不能出现前导零),但是排序后的序列可能将出现在最高位过的字母排到最后一位,赋值为0就非法了。所以这种情况需要特判,然后从后往前找第一个没出现在最高位的字母替换到最后,前面依次迁移。

    #include<bits/stdc++.h>
    
    
    using namespace std;
    #define LL long long
    int n;
    int maxj;
    const int MAXN=1e5+7;
    const int MOD=1e9+7;
    LL k[MAXN];
    LL num[30];
    
    struct node
    {
        int id;
        int num[MAXN]={0};
        bool operator <(const node&a)const
        {
            for(int j=maxj;j>=0;j--)
            {
                if(num[j]!=a.num[j])
                    return num[j]>a.num[j];
            }
            return 0;
        }
    }p[30];
    int book[30];
    string s[MAXN];
    
    int main()
    {
        ios::sync_with_stdio(false);
        k[0]=1;
        for(int i=1;i<100000;i++)
        {
            k[i]=(k[i-1]*26)%MOD;
        }
        int ca=0;
        maxj=0;
        while(cin>>n)
        {
            for(int i=0;i<26;i++)
            {
                book[i]=0;
                for(int j=0;j<=maxj;j++)
                {
                    p[i].num[j]=0;
                }
                p[i].id=i;
            }
    
            for(int i=0;i<n;i++)
            {
                cin>>s[i];
                int l=s[i].size();
                for(int ii=l-1,j=0;ii>=0;ii--,j++)
                {
                    if(ii==0)book[s[i][ii]-'a']=1;
                    int t=s[i][ii]-'a';
                    p[t].num[j]++;
                }
            }
            maxj=0;
            for(int i = 0; i < 26; ++i)
            {
                for(int j = 0; j <= 100000; ++j)
                {
                    p[i].num[j+1] += p[i].num[j]/26;
                    p[i].num[j]%=26;
                    if(p[i].num[j]>0)maxj=max(j, maxj);
                }
            }
            sort(p,p+26);
            int i;
            if(book[p[25].id])
            {
            for(i=25; i>=0; i--)if(book[p[i].id]==0)break;
            p[26]=p[i];
            for(; i<26; i++)p[i]=p[i+1];
            }
            for(int i = 25; i >= 0; --i)num[p[25-i].id] = i;
    
            //printf("%d
    ",p[0].id);
            long long ans = 0;
            for(int i = 0; i < n; ++i)
            {
                int l = s[i].size();
                for(int j = 0; j < l; ++j)
                {
                    //printf("%d
    ", num[s[i][j]-'a']);
                    ans = (ans+num[s[i][j] -'a']*k[l-1-j]%MOD)%MOD;
                }
            }
            cout<<"Case #"<<++ca<<": "<<ans<<endl;
    
        }
    
    
    
        return 0;
    }
    
  • 相关阅读:
    一个iOS程序员眼中的跨域问题
    web 大规模并发访问的解决方案
    修改Capfile,在正式环境不再使用migration修改数据库
    关于 CAS 不能登录的问题
    老项目占地比较大的原因是release文件夹里有.git 目录
    capistrano3.4.0部署不能自动登录
    capistrano/blob/v3.4.0部署
    私有方法的查找方式
    开启关闭功能没有生效的原因
    找不到Settings
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386899.html
Copyright © 2020-2023  润新知