您的位置:首页 > 其它

HDU-2017 多校训练赛1-1002-Balala Power!

2017-07-25 17:10 567 查看
ACM模版

描述



题解

这个题,是我的一个痛点……真心不难,可是我无限 CE 啊……

思路上,很简单,判断每个字母的贡献,根据贡献排行进行分配,注意前缀不能为 0 的情况。这就是中心思想,很简单……

可是一开始我就无限 CE,先是本机测试编译错误,后来发现是爆内存了,找了好久注意到,在排序的对比函数 cmp() 中,参数没有加引用,这一大杀招,我竟然忘了,导致内存爆掉了,然后我加上后,本地没有问题了,可是三番五次提交都是 CE,然后我又各种改代码,始终无法逃离 CE(代码 One)的魔咒,最后索性重写了一份,顺利 AC(代码 Two) 了,可是感觉和原代码没有啥太大的分别啊,不明了了……贴出来,看看哪个大神能帮我找到吧!

代码

One:

//  CE
//#include <iostream>
//#include <algorithm>
//#include <string>
//#include <cstring>
//#include <cstdio>
//
//using namespace std;
//
//const int MAXK = 26;
//const int MAXS = 1e5 + 10;
//const int MOD = 1e9 + 7;
//
//int n, cnt;
//int vis[MAXK];
//string s;
//
//struct xxx
//{
//    int pos;
//    int len;
//    int num[MAXS];
//} Num[MAXK];
//
//bool cmp(const xxx &a, const xxx &b)
//{
//    if (a.len != b.len)
//    {
//        return a.len > b.len;
//    }
//    for (int i = a.len; i > 0; i--)
//    {
//        if (a.num[i] != b.num[i])
//        {
//            return a.num[i] > b.num[i];
//        }
//    }
//
//    return a.num[0] > b.num[0];
//}
//
//int main(int argc, const char * argv[])
//{
//    int ce = 1;
//
//    while (cin >> n)
//    {
//        cnt = 25;
//        memset(vis, 0, sizeof(vis));
//        memset(Num, 0, sizeof(Num));
//        for (int i = 0; i < MAXK; i++)
//        {
//            Num[i].pos = i;
//        }
//
//        for (int i = 0; i < n; i++)
//        {
//            cin >> s;
//            if (s.length() > 1)
//            {
//                vis[s[0] - 'a'] = 1;
//            }
//
//            for (int j = 0, k = (int)s.length(); j < s.length(); j++, k--)
//            {
//                int t = s[j] - 'a';
//                Num[t].num[k]++;
//                int x = k;
//                while (Num[t].num[x] == MAXK)
//                {
//                    Num[t].num[x++] = 0;
//                    Num[t].num[x]++;
//                }
//                Num[t].len = max(Num[t].len, x);
//            }
//        }
//
//        sort(Num, Num + MAXK, cmp);
//
//        if (vis[Num[MAXK - 1].pos])
//        {
//            int i = MAXK - 1;
//            for (; i >= 0; i--)
//            {
//                if (vis[i] == 0)
//                {
//                    break;
//                }
//            }
//            xxx a = Num[i];
//            for (; i < MAXK - 1; i++)
//            {
//                Num[i] = Num[i + 1];
//            }
//            Num[MAXK - 1] = a;
//        }
//
//        long long res = 0;
//        for (int i = 0; i < n; i++)
//        {
//            long long tmp = 0;
//            for (int j = Num[i].len; j > 0; j--)
//            {
//                tmp *= MAXK;
//                tmp += (long long)Num[i].num[j] * cnt;
//                tmp %= MOD;
//            }
//            cnt--;
//            res += tmp;
//            res %= MOD;
//        }
//
//        cout << "Case #" << ce++ << ": " << res << '\n';
//    }
//
//    return 0;
//}


Two:

//  AC
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

typedef long long ll;

const int MAXN = 1e5 + 10;
const int MAXK = 26;
const int MOD = 1e9 + 7;

struct node
{
int pos;
char num[MAXN];
} Num[MAXK + 1];

int vis[MAXK];

bool cmp(node &A, node &B)
{
for (int i = MAXN - 1; i > 0; i--)
{
if (A.num[i] != B.num[i])
{
return A.num[i] < B.num[i];
}
}
return A.num[0] < B.num[0];
}

int n;
char str[MAXN];

int main()
{
int ce = 1;
while (~scanf("%d", &n))
{
for (int i = 0; i < MAXK; i++)
{
vis[i] = 0;
Num[i].pos = i;
for (int j = 0; j < MAXN; j++)
{
Num[i].num[j] = 0;
}
}

int x, y;
for (int i = 0; i < n; i++)
{
scanf("%s", str);

int len = (int)strlen(str);

if (len > 1)    //  前置标记
{
vis[str[0] - 'a'] = 1;
}

for (int j = 0 ; j < len; j++)
{
x = str[j] - 'a';
y = len - j - 1;
Num[x].num[y]++;

while (Num[x].num[y] == MAXK)
{
Num[x].num[y++] = 0;
Num[x].num[y]++;
}
}
}

sort(Num, Num + MAXK, cmp);

int op = -1;
ll ans = 0, tmp, mul;
for (int i = 0; i < MAXK; i++)
{
if (vis[Num[i].pos] == 0)
{
op = i;
break;
}
}

for (int i = 0; i < MAXK; i++)
{
tmp = 0;
mul = 0;

if (i == op)
{
mul = 0;
}
else if (i < op)
{
mul = i + 1;
}
else
{
mul = i;
}

for (int j = MAXN - 1; j >= 0; j--)
{

tmp = (tmp * MAXK) % MOD;
tmp = (tmp + (ll)Num[i].num[j] * mul) % MOD;
}
ans = (ans + tmp) % MOD;
}

printf("Case #%d: %lld\n", ce++, ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心