hdu6034[模拟] 2017多校1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu6034[模拟] 2017多校1相关的知识,希望对你有一定的参考价值。

/*hdu6034[模拟] 2017多校1*/
//暴力模拟26个26进制数即可, 要注意进位
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
struct node{
    char num[100005];
    int ch,high;
}bits[30];
const int mod=1000000007;
int n,len,pos,mark[30],w[30],kase=1;
char str[100005];
LL fastpow(LL a,LL b){
    LL ret=1,x=a;
    while(b){
        if(b&1){
            ret=(ret*x)%mod;
        }
        x=(x*x)%mod;
        b>>=1;
    }
    return ret;
}
bool cmp(node a,node b){
    if(a.high!=b.high){
        return a.high>b.high;
    }
    else{
        for(int i=a.high-1;i>=0;i--){
            if(a.num[i]>b.num[i]){
                return 1;
            }
            else if(a.num[i]<b.num[i]){
                return 0;
            }
        }
    }
    return 0;
}
LL cal(node& a){
    LL ret=0;
    for(int i=0;i<a.high;i++){
        if(a.num[i]){
            ret=(ret+((LL)a.num[i]*fastpow(26LL,i))%mod)%mod;
        }
    }
    return ret;
}
void solve(){
    LL sum=0;
    sort(bits,bits+26,cmp);
    for(int i=0;i<26;i++){
        if(bits[i].high) w[bits[i].ch]=25-i;
        if(mark[bits[i].ch]&&w[bits[i].ch]==0){
            int pos=i;
            while(mark[bits[pos].ch]&&pos) pos--;
            for(int j=pos+1;j<26;j++) w[bits[j].ch]++;
            w[bits[pos].ch]=0;
        }
    }
    for(int i=0;i<26;i++){
        sum=(sum+w[bits[i].ch]*cal(bits[i]))%mod;
    }
    printf("Case #%d: %lld\n",kase++,sum);
}
int main(){
    while(~scanf("%d",&n)){
        memset(bits,0,sizeof(bits));
        memset(w,0,sizeof(w));
        memset(mark,0,sizeof(mark));
        for(int i=0;i<26;i++) bits[i].ch=i;
        for(int i=0;i<n;i++){
            scanf("%s",str);
            len=strlen(str);
            mark[str[0]-a]++;
            for(int i=0;i<len;i++){
                pos=len-i-1;
                bits[str[i]-a].high=max(bits[str[i]-a].high,pos+1);
                bits[str[i]-a].num[pos]++;
                while(pos<99999&&bits[str[i]-a].num[pos]>=26){
                    int k=bits[str[i]-a].num[pos]/26;
                    bits[str[i]-a].num[pos]-=26;
                    bits[str[i]-a].num[++pos]++;
                }bits[str[i]-a].high=max(bits[str[i]-a].high,pos+1);
            }
        }solve();
    }
    return 0;
}

 

以上是关于hdu6034[模拟] 2017多校1的主要内容,如果未能解决你的问题,请参考以下文章

2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!字符串,贪心+排序(示例代码(代

HDU 6034 贪心

hdu5387(2015多校8)--Clock(模拟)

2017多校第10场 HDU 6181 Two Paths 次短路

hdu6035[dfs+思维] 2017多校1

HDU6038-Function-数学+思维-2017多校Team01