首页 > 代码库 > 6034 模拟(排序)

6034 模拟(排序)

题意:将‘a‘~‘z‘一一映射到0~25 若string第i位为c则价值f(c)*26^i 给出n个string 问价值最大为?  |s|累加<=1e6

字符c对答案的贡献可以用26进制数来表示 排序后,最大贡献的系数用25,依次..

处理前导0时,排序后从价值最低的选出能作为0的字符

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> ii;
const ll mod=1e9+7;
const int N=1e5+5;
struct node{
    char c[N];
    int id;
}a[27];
char s[N];
ll pw[N],lead[27],cnt;
bool cmp(node &a,node &b)
{
    for(int i=N-1;i>0;i--)
    {
        if(a.c[i]!=b.c[i])
            return a.c[i]<b.c[i];
    }
    return a.c[0]<b.c[0];
}
void init()
{
    cnt=0;
    memset(lead,0,sizeof(lead));
    for(int i=0;i<26;i++)
    {
        a[i].id=i;
        for(int j=0;j<N;j++)
            a[i].c[j]=0;
    }
}
int main()
{
    pw[0]=1;
    for(ll i=1;i<N;i++)
        pw[i]=(pw[i-1]*26ll)%mod;
    int n,cas=0;
    while(scanf("%d",&n)!=EOF)
    {
        init();
        while(n--)
        {
            scanf("%s",s);
            int len=strlen(s);
            for(int i=0;s[i];i++)
            {
                if(len>1)
                    lead[s[0]-a]=1;
                int id=s[i]-a;
                a[id].c[len-i-1]++;
                int j=len-i-1;
                while(j<N&&a[id].c[j]==26)
                    a[id].c[j]=0,a[id].c[++j]++;        
                    
            }
        }
        sort(a,a+26,cmp);
        ll ans=0,pos=0;
        for(int i=0;i<26;i++)
        {
            if(lead[a[i].id]==0)
            {
                pos=i;
                break;
            }
        }
        for(int i=0;i<26;i++)
        {
            ll x=i;
            if(i==pos)
                x=0;
            else if(i<pos)
                x=i+1;    
            for(int j=0;j<N;j++)
            {
                ll res=((((ll)a[i].c[j]*pw[j])%mod)*x)%mod;
                ans=(ans+res)%mod;
            }
        }
        printf("Case #%d: %lld\n",++cas,ans);    
    }
    return 0;
}

 

6034 模拟(排序)