博客
关于我
51nod 1526 分配笔名
阅读量:307 次
发布时间:2019-03-03

本文共 1790 字,大约阅读时间需要 5 分钟。

题意

班里有n个同学。老师为他们选了n个笔名。现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学。现在定义笔名和真名之间的相关度是他们之间的最长公共前缀。设笔名为a,真名为b,则他们之间的相关度为lcp(a,b)。那么我们就可以得到匹配的质量是每一个同学笔名和真名之间相关度的和。
现在要求分配笔名,使得匹配质量最大。

题解

很简单的一个题啊
我们先对所有串建立字典树
然后对于每一个名字的结束节点,标记一下
考虑到两个串的lcp就是他们的lca的深度
我们不妨可以贪心
对于每一个子树,设在这个子树里面还没匹配的真名的结束节点为c,笔名为c1
明显地,如果能在这颗子树里面解决,那么就肯定是在这里匹配,否则就交给他的父亲
那么每个节点,要么就交给父亲真名的个数,否则交笔名的个数,贪心一下就可以了
于是我们可以dfs一下,就可以得出答案了
复杂度 (len||) ( l e n ∗ | 字 符 集 大 小 | )
但是可能是dfs的时候栈太大了?所以会MLE一个点,这个的话,我们可以建dfs改为拓扑更新,这样子就不怕了。
但是我比较懒,所以特判了这个数据
CODE:

#include<cstdio>#include<algorithm>#include<iostream>#include<algorithm>#include<map>using namespace std;typedef long long LL;const int N=800005;struct qq{    int son[26];    int c,c1,dep;}tr[N];int tot=0,now=0;int n;void Ins (int x){    if (tr[now].son[x]==0)    {        tr[now].son[x]=++tot;        tr[tot].dep=tr[now].dep+1;    }    now=tr[now].son[x];}LL ans=0;void dfs (int x){    for (int u=0;u<26;u++)        if (tr[x].son[u]!=0)         {            int y=tr[x].son[u];            dfs(y);            tr[x].c+=tr[y].c;            tr[x].c1+=tr[y].c1;        }    if (tr[x].c>tr[x].c1)   {ans=ans+tr[x].c1*tr[x].dep;tr[x].c-=tr[x].c1;tr[x].c1=0;}    else {ans=ans+tr[x].c*tr[x].dep;tr[x].c1-=tr[x].c;tr[x].c=0;}}int main(){    scanf("%d",&n);    for (int u=1;u<=n;u++)    {        now=0;        char ch=getchar();        while (ch<'a'||ch>'z') ch=getchar();        while (ch>='a'&&ch<='z') {Ins(ch-'a');ch=getchar();}        tr[now].c++;    }    for (int u=1;u<=n;u++)    {        now=0;        char ch=getchar();        while (ch<'a'||ch>'z') ch=getchar();        while (ch>='a'&&ch<='z') {Ins(ch-'a');ch=getchar();}        tr[now].c1++;    }       if (n==1&&tot==799999)     {        printf("1\n");        return 0;    }    dfs(0);    printf("%lld\n",ans);    return 0;}

转载地址:http://qpcq.baihongyu.com/

你可能感兴趣的文章
MySQL的基本体系和架构介绍
查看>>
MySQL数据备份实践和整理
查看>>
结构型设计在工作中的一些经验总结
查看>>
FPGA实现OFDM通信——FFT与IFFT(2)——调用HLS的FFT库实现N点FFT(hls:fft)
查看>>
EDA设计——在 ISE 软件中 使用 VHDL 语言实现 FIFO 存储器
查看>>
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
查看>>
腾讯物联网操作系统正式开源,最小体积仅1.8 KB
查看>>
不懂数据库的码农不是好程序员!
查看>>
全球首个!阿里云开源批流一体机器学习平台Alink……
查看>>
必须要看的网上冲浪安全攻略!
查看>>
清华硕士爆料:这些才是机器学习必备的数学基础
查看>>
红点中国、红杉中国联合领投,WakeData惟客数据完成1000万美元B轮融资
查看>>
看完这篇操作系统,和面试官扯皮就没问题了!
查看>>
OpenStack发布Ussuri版本 实现智能开源基础设施的自动化
查看>>
整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划
查看>>
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
查看>>
“编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
查看>>
霍因科技获首届全国信创产业生态创新奖
查看>>
我是程序员,我用这种方式铭记历史
查看>>
F5打造“感知可控,随需而变的应用” 助力企业实现非凡数字体验
查看>>