zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
  • 相关阅读:
    java 网络编程
    JAVA 中for-each循环使用方法
    JAVA 常用集合接口List、Set、Map总结
    android学习计划
    ExtJs
    jQuery easyui
    MVC
    简易servlet计算器
    使用servlet实现用户注册功能
    用JavaBean实现数据库的连接和关闭,在jsp页面输出数据库中student表中学生的信息
  • 原文地址:https://www.cnblogs.com/UnderSilenceee/p/7295987.html
Copyright © 2011-2022 走看看