hdu 6034 贪心模拟 好坑

news/2024/7/8 2:03:41

关键在排序!!!

数组间的排序会超时,所以需要把一个数组映射成一个数字,就可以了

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 1e5 + 5;
const ll Mod = 1e9 + 7;
int len,ltt[26][maxn];
char s[maxn];
bool apr[26];
ll pow26[maxn];

void init()
{
    int len = strlen(s);
    for(int i = 0; i < len; i++)
        ltt[s[i]-'a'][len - 1 - i]++;
}

bool cmp(int A, int B)
{
    for (int i = len - 1 ; i >= 0 ; -- i)
    {
        if (ltt[A][i] != ltt[B][i])
            return ltt[A][i] < ltt[B][i];
    }
    return 0;
}


int main()
{
//    freopen("in.txt","r",stdin);
    int n;
    int kase = 1;
    pow26[0] = 1;
    for(int i = 1; i < maxn; i++)
        pow26[i] = pow26[i-1]*26%Mod;
    while(~scanf("%d", &n))
    {
        memset(apr, 0, sizeof(apr));
        memset(ltt, 0, sizeof(ltt));
        len = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%s",s);
            int len1 = strlen(s);
            if(len1 > 1) apr[s[0] - 'a'] = 1;
            len = max(len,len1);
            init();
        }

        int a[26];  //a数组是ltt数组的映射

        //进位
        for(int i = 0; i < 26; i++)
        {
            for(int j = 0; j < len; j++)
            {
                ltt[i][j+1] += ltt[i][j]/26;
                ltt[i][j] %= 26;
            }
            while(ltt[i][len])
            {
                ltt[i][len+1] += ltt[i][len]/26;
                ltt[i][len++] %= 26;
            }
            a[i] = i;
        }
        sort(a, a + 26, cmp);
        int num[26] = {0};
        if(len > 1)
        {
            bool flag = 1;
            int v = 1;
            for(int i = 0; i < 26; i++)
            {
                if(flag && !apr[a[i]])
                {
                    num[i] = 0;
                    flag = 0;
                }
                else num[i] = v++;
            }
        }
        else
        {
            for(int i = 0; i < 26; i++)
                num[i] = i;
        }
        ll res = 0;
        for(int i = 0; i < 26; i++)
            for(int j = 0; j < len; j++)
                res = (res + num[i]*ltt[a[i]][j]*pow26[j])%Mod;
        printf("Case #%d: %I64d\n", kase++, res);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/pach/p/7238668.html


http://www.niftyadmin.cn/n/1478536.html

相关文章

Linux剩余信息保护怎么实现,保护Linux系统安全的九个常用方法

保护Linux系统安全的九个常用方法1.在以root身份登录时&#xff0c;避免做一些常规工作。这会减少你感染病毒的风险&#xff0c;并且可以防止你犯一些错误。2.如果可能的话&#xff0c;在一台远程机器上工作时&#xff0c;尽量使用加密连接。使用SSH来代替telnet、ftp、rsh、rl…

关于CASE中使用聚合函数时的一点经验

先不要管以下代码是完成什么功能--片段1selectcase when SUM(isnull(ACTVTY_DURTN,0))>1 then 1 else SUM(isnull(ACTVTY_DURTN,0)) end as DURTN,OWNR_EMP_ID_NKfrom dbo.ECMS_Activity_DIMN ACWHERE AC.APPT_STRT_DT_TZ BETWEEN 201208 AND 201209AND AC.actvty_main_type…

UnQLite简介

UnQLite是&#xff0c;由 Symisc Systems公司出品的一个嵌入式C语言软件库&#xff0c;它实现了一个自包含、无服务器、零配置、事务化的NoSQL数据库引擎。UnQLite是一个文档存储数据库&#xff0c;类似于MongoDB、Redis、CouchDB等。同时&#xff0c;也是一个标准的Key/Value存…

网页高度计算方法

document.compatMode(声明是转的&#xff0c;只是为了记下来&#xff0c;以后好用啊。嘿嘿) 对于document.compatMode&#xff0c;很多朋友可能都根我一样很少接触&#xff0c;知道他的存在却不清楚他的用途。今天在ext中看到 document.compatMode的使用&#xff0c;感觉这个对…

linux系统中软盘的名称,linux中软盘的使用

linux中软盘的使用发布时间:2008-04-16 01:28:21来源:红联作者:nutra前两天去面试&#xff0c;做了一份试卷&#xff0c;就一道题没答出来&#xff0c;那张卷子的第一道题&#xff0c;“linux下怎么挂载软盘“后面其它的写脚本什么的都搞定了&#xff0c;就这一个卡了&#xff…

linux系统解压.tar.gz文件命令,linux中tar命令怎么解压.tgz与.tar.gz文件-linux-操作系统-壹聚...

在linux中.tgz是.tar.gz的缩写&#xff0c;我们在解压.tgz文件时可直接使用tar命令来操作,有需要了解的朋友可参考参考。如&#xff1a;将文件解压在当前目录&#xff1a;代码如下复制代码tar zxvf MY_NAME.tgz 或者 tar zxvf MY_NAME.tar.gz例&#xff1a;查看usr.tar备份文…

linux驱动无法绑定,LINUX驱动手动绑定和解绑定

Linux内核从2.6.13-rc3开始&#xff0c;提供了在用户空间&#xff0c;可动态的绑定和解绑定设备和设备驱动之间关系的功能。在这之前&#xff0c;只能通过insmod(modprobe)和rmmod来绑定和解绑&#xff0c;而且这种绑定和解绑都是针对驱动和所有设备的。而新的功能可以设置驱动…

管道文件 linux 流程图,怎样绘制工艺管道仪表流程图(PID图)和工艺流程图

工艺流程图是化工生产的技术核心&#xff0c;包含了物料平衡、设备、仪表、阀门、管路等信息&#xff0c;无论是设计院的工程师、化工厂的工艺员&#xff0c;还是中控控制室的主操&#xff0c;能看能画工艺流程图&#xff0c;都是必不可少的技能。今天昌晖仪表向大家介绍工艺流…