Balala Power! HDU - 6034 多校1

很烦的一道题,当时比赛的时候wa了9次,TLE了10+次,还是没过;
第一种思路是将所有的字母都化为到个位,然后一边取模,在打表之后时间够了,但是一直wa,也没找到错的地方;
第二种思路是用26个字符串固定26个字母,就是考虑进位的地方有点繁琐,但一直TLE;
最后时间到了。。
在补题的时候,就试着用数组代替字符串,然后重复操作,再做到找到最小的可做0的一位做0,还是选择 C++ 提交还是TLE,后来同样的代码改了G++就过了。

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
typedef long long ll;  
const int mod = 1e9+7;  
const int maxn = 1e5+5;  
ll fac[maxn] = {1};  
int Hash[27];  
bool lead[27];  
char str[maxn];  

void init()  
{  
    for(int i = 1; i < maxn; i++)  
        fac[i] = fac[i-1]*26%mod;  
}  

struct node  
{  
    int cnt[maxn];  
    int id;  
    bool operator < (const node &a) const  
    {  
        for(int i = maxn-1; i >= 0; i--)  
        {  
            if(cnt[i] > a.cnt[i]) return 1;  
            else if(cnt[i] < a.cnt[i]) return 0;  
            else ;  
        }  
    }  
}a[27];  

int main(void)  
{  
    int n, ca = 1;  
    init();  
    while(~scanf("%d", &n))  
    {  
        memset(a, 0, sizeof(a));  
        memset(Hash, -1, sizeof(Hash));  
        memset(lead, 0, sizeof(lead));  
        for(int i = 1; i <= n; i++)  
        {  
            scanf(" %s", str);  
            int len = strlen(str);  
            if(len != 1)  
                lead[str[0]-'a'] = 1;  
            for(int i = 0; i < len; i++)  
                a[str[i]-'a'].cnt[len-i-1]++;  
        }  
        //进位操作,满26个等与一个下一位  
        for(int i = 0; i < 26; i++)  
        {  
            for(int j = 0; j < maxn; j++)  
            {  
                if(a[i].cnt[j] >= 26)  
                {  
                    a[i].cnt[j+1] += a[i].cnt[j]/26;  
                    a[i].cnt[j] %= 26;  
                }  
            }  
            a[i].id = i;  
        }  
        sort(a, a+26);  
        for(int i = 0; i < 26; i++)  
            Hash[a[i].id] = 26-i-1;  
        for(int i = 0; i < 26; i++) //前导0找最小的可以做0的位来放0  
            if(lead[a[i].id] && Hash[a[i].id] == 0)  
            {  
                for(int j = 25; j >= 0; j--)  
                {  
                    if(!lead[a[j].id])  
                    {  
                        for(int k = 25; k >= j+1; k--)  
                            Hash[a[k].id] = Hash[a[k-1].id];  
                        Hash[a[j].id] = 0;  
                        break;  
                    }  
                }  
                break;  
            }  
        ll ans = 0;  
        for(int i = 0; i < 26; i++)  
        {  
            for(int j = 0; j < maxn; j++)  
            {  
                ans = (ans+fac[j]*a[i].cnt[j]*Hash[a[i].id]%mod)%mod;  
            }  
        }  
        printf("Case #%d: %lld\n", ca++, ans);  
    }  
    return 0;  
}

看来还是太年轻。。如果TLE就G++,C++都交一边

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值