hdu 6034 Balala Power!

来源:互联网 发布:新浪微博刷粉软件 编辑:程序博客网 时间:2024/05/24 01:48



点击打开链接


题意:


        给你26个字母,他们对应的权值分别是0~25;权值由你决定。

        现在让你决定他们的权值,让他们的和最大,并把最大的和输出出来。

      

题解:

       题意很简单,思路也很简单,,可是我wa了10来次,,,,,,,

       最开始看错题,,以为 |s|‘ 小于等于100000, 那岂不是最长4位数字,美滋滋,

       后来已知re 才知道,字符串长度 最长 100000;,,,,,真是日了狗了,,,截至到这里已经错了8、9次了。。

       后来老老实实开一个26*100000的结构体,来计算他们的贡献值以及那个字母,排序,,,

       又陷入一个什么都对交上去wa的bug,,,,后来发现,记录的字母有个地方写成数字了,。。

       哎,还是太菜。


#include <bits/stdc++.h>#define ll long longusing namespace std;const int maxn=1e5+10;const int mod=1e9+7;const ll inf=1e17;struct node{    char c;    char v[maxn];}a[27];int v1[30],v2[30];ll fn[maxn];map<char ,int>ma;char s[maxn];bool cmp(node x,node y){    for(int i=maxn-1;i>0;--i){        if(x.v[i]!=y.v[i])            return x.v[i]<y.v[i];    }    return x.v[0]<y.v[0];}int main(){    int n,ca=1;    int tem=1;    fn[0]=1;    for(int i=1;i<maxn;++i){        fn[i]=(fn[i-1]*26)%mod;    }    while(~scanf("%d",&n)){        for(int i=0;i<26;++i)            a[i].c=i+'a';        memset(v1,0,sizeof(v1));        ma.clear();        for(int i=0;i<27;++i)            memset(a[i].v,0,sizeof(a[i].v));        for(int i=1;i<=n;++i){            scanf("%s",s);            int len=strlen(s);            if(len>1){                if(!v1[s[0]-'a'+1])                    v1[s[0]-'a'+1]=1;            }            for(int j=0;j<len;++j){                int pos=len-j-1;                int x=s[j]-'a';                a[x].v[pos]++;                while(a[x].v[pos]==26) {                    a[x].v[pos]=0;                    a[x].v[++pos]++;                }            }        }        sort(a,a+26,cmp);        int f=0,va=1;        for(int i=0;i<26;++i){            if(!v1[a[i].c-'a'+1]&&!f){                ma[a[i].c]=f;                f=1;                continue;            }            ma[a[i].c]=va++;        }        ll ans=0;        for(int i=0;i<26;++i){            if(ma[a[i].c]==0)continue;            ll ret=0;            for(int j=0;j<maxn;++j){                if(a[i].v[j]==0) continue;                ret=(ret+(ll)ma[a[i].c]*(((ll)a[i].v[j]*fn[j])%mod))%mod;            }            ans=(ans+ret)%mod;        }        printf("Case #%d: %lld\n",ca++,ans);    }    return 0;}


 

原创粉丝点击