HDU 6034 Balala Power!(贪心)

来源:互联网 发布:note express for mac 编辑:程序博客网 时间:2024/06/03 04:23

题目地址
题意:给a-z不同的的值(0-25),将下面的字符串看成一个26进制数,求字符串和转化成十进制的最大值,注意如果一个字符串长度>1,则首字母不能赋值成0。
题解:贪心的想,肯定是高位出现次数多的字母赋大值,我们找一个没出现在首字母并且赋值小的,让它为0.
代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<set>#include<algorithm>#include<map>using namespace std;typedef long long int ll;typedef pair<int,int>pa;const int N=1e5+10;const int mod=1e9+7;const ll INF=1e18;const int inf=1e4;int read(){    int x=0;    char ch = getchar();    while('0'>ch||ch>'9')ch=getchar();    while('0'<=ch&&ch<='9')    {        x=(x<<3)+(x<<1)+ch-'0';        ch=getchar();    }    return x;}/***********************************************************/int num[30][N];int vis[30];int mi[N];int sum[N];int mx_len;char str[N];int a[30];int n,Case;bool cmp(int x,int y){    for(int i=mx_len-1; i>=0; i--)    {        if(num[x][i]!=num[y][i])            return num[x][i]<num[y][i];    }    return 0;}void init(){    mx_len=0;    memset(num,0,sizeof(num));    memset(vis,0,sizeof(vis));    memset(sum,0,sizeof(sum));}void solve(){    for(int i=0; i<n; i++)    {        scanf("%s",str);        int len=strlen(str);        if(len>1)            vis[str[0]-'a']=1;        reverse(str,str+len);        for(int j=0; j<len; j++)        {            num[str[j]-'a'][j]++;            sum[str[j]-'a']+=mi[j];            if(sum[str[j]-'a']>=mod)                sum[str[j]-'a']%=mod;        }        mx_len=max(mx_len,len);    }    for(int i=0; i<26; i++)    {        for(int j=0; j<mx_len; j++)        {            num[i][j+1]+=num[i][j]/26;            num[i][j]%=26;        }        while(num[i][mx_len])        {            num[i][mx_len+1]=num[i][mx_len]/26;            num[i][mx_len]%=26;            mx_len++;        }        a[i]=i;    }    sort(a,a+26,cmp);    int ans=-1;    for(int i=0; i<26; i++)    {        if(!vis[a[i]])        {            ans=a[i];            break;        }    }    int res=0;    int x=25;    for(int i=25; i>=0; i--)    {        if(a[i]!=ans)        {            res+=(ll)(x--)*sum[a[i]]%mod;            res%=mod;        }    }    printf("Case #%d: %d\n",++Case,res);}int main(){    mi[0]=1;    Case=0;    for(int i=1; i<=N; i++)    {        mi[i]=(ll)mi[i-1]*26%mod;    }    while(~scanf("%d",&n))    {        init();        solve();    }    return 0;}