题目链接在这

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题
收藏
关注

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

现在要求分配笔名,使得匹配质量最大。

样例解释:

·        bill → bilbo (lcp = 3)

·        galya → galadriel (lcp = 3)

·        gennady → gendalf (lcp = 3)

·        toshik → torin (lcp = 2)

·        boris → smaug (lcp = 0)

Input
单组测试数据。
第一行有一个整数n (1≤n≤100000),表示班级中同学的数目。
接下来n行,表示每一个同学的真名,每一个名字是非空串,且由小写字母组成。
名字可能重复。
最后n行是老师已经安排好的笔名。每一个笔名是一个非空串,且由小写字母组成。
笔名可能重复。
输入的字符总数目不超过 800000。
Output
输出最大的匹配质量。
Input示例
样例输入1
5
gennady
galya
boris
bill
toshik
bilbo
torin
gendalf
smaug
galadriel
Output示例
样例输出1
11
很容易想到一个贪心的算法是,对于每一个笔名,把他用在使得他贡献最大的人身上,字符串前缀最大,数据量又很大,考虑使用字典树把人名存下,用笔名在树上匹配。思路是对的但出了一个bug。
如果在某个称号还未配对时,他的最优人被其他人用了咋整。可以这样想,每个结点统计前缀个数vis[u],匹配时只要vis[u]存在就让ans++;累计一个贡献,最后就是正解。假如这个前缀有多个,那就是
按贡献大小给占用他的人,如果个数有限的话,那么势必会有一些名称的匹配贡献是0,我们当然要让匹配的少的那些为零。这个过程在代码里不会呈现但不会影响最终结果。
假如有笔名: abxx abccc 有人名: abccx 有且仅有一个
当abxx先找时,相当于贡献了'a','b'两个贡献,余下的不再匹配树上这两个字符对应节点的价值也会减一(归零),当abccc进行匹配时,会做出'c','c'两个贡献
这样一共进行了四个贡献,虽然看起来abccc前缀并没有完全匹配,但只不过是"abxx"提前替他匹配了一小段前缀而已。
 #include<bits/stdc++.h>
using namespace std;
int ch[][];
int sz=,ans=;
int vis[];
char s[];
void insert(char *s){
int u=,n=strlen(s);
for(int i=;i<n;++i){
int c=s[i]-'a';
if(!ch[u][c]) ch[u][c]=sz++;
vis[u]++;
u=ch[u][c];
}
vis[u]++;
}
void match(char *s){
int i,u=,n=strlen(s),r=,ret=;
for(i=;i<n;++i){
int c=s[i]-'a';
if(ch[u][c]==) return ;
u=ch[u][c];
if(vis[u]){
vis[u]--;
ans++;
}
}
}
int main()
{
int n,m,i,j,k;
cin>>n;
for(i=;i<=n;++i){
scanf("%s",s);
insert(s);
}
for(i=;i<=n;++i){
scanf("%s",s);
match(s);
}
printf("%d\n",ans);
return ;
}
/*
5
gennady
galya
boris
bill
toshik bilbo
torin
gendalf
smaug
galadriel
*/

51nod-1526-贪心+Trie的更多相关文章

  1. 51nod 1526 分配笔名(Trie树+贪心)

    建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...

  2. 51nod 1526 分配笔名(字典树+贪心)

    题意: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...

  3. 51nod 1163贪心

    用优先队列来贪心,是一个很好地想法.优先队列在很多时候可以维护最值,同时可以考虑到一些其他情况. http://www.51nod.com/onlineJudge/questionCode.html# ...

  4. 【贪心/Trie】【CF1083B】 The Fair Nut and Strings

    Description 有 \(k\) 个长度为 \(n\) 的只含 \(a\) 或 \(b\) 字符串,并不知道它们具体是多少,只知道它们的字典序不小于字符串 \(A\),同时不大于字符串 \(B\ ...

  5. 51nod 1625 贪心/思维

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 1625 夹克爷发红包 基准时间限制:1 秒 空间限制:13107 ...

  6. 51nod 1099 贪心/思维

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1099 1099 任务执行顺序 基准时间限制:1 秒 空间限制:13107 ...

  7. 51nod 1428 贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活动安排问题 基准时间限制:1 秒 空间限制:13107 ...

  8. [bzoj4567][Scoi2016][背单词] (贪心+trie树)

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...

  9. BZOJ 1954: Pku3764 The xor-longest Path(贪心+trie)

    传送门 解题思路 \(trie\)的一个比较经典的应用,首先把每个点到根的异或和算出,然后建一棵\(trie\)把所有权值插入到\(Trie\)中,之后枚举所有结点,在\(Trie\)上贪心的跑统计答 ...

  10. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)

    题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...

随机推荐

  1. MyBatis 之动态SQL

    1. 概述 动态 SQL 极大的简化了我们拼装SQL的操作; MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作: if choose(when,otherwise) trim(wher ...

  2. Eclipse 介绍

    设置背景的插件: Darkest Dark Theme 添加 properties 插件: Properties Editor Git 插件: Egit 常用快捷键 command + 1 : 代码提 ...

  3. LinkedList基本用法

    https://blog.csdn.net/i_lovefish/article/details/8042883

  4. 《CNI specification》翻译

    Overview 本文提出了一个通用的基于插件的Linux容器网络解决方案,容器网络接口,CNI.它脱胎于旨在满足大多数rtk网络设计的rtk Networking Proposal. 首先,我们对如 ...

  5. 批量处理任务进度条控制—基于BackgroundWorker

    今天要做一个批量处理图层数据的功能,希望在处理任务过程中,各个任务都能在进度条中显示自己的当前进度,决定继续使用强大易用的BackgroundWorker组件.通过在RunWorkerComplete ...

  6. myeclipse如何删除自带Javaee里面jar包

    myeclipse是我们在使用Java开发时的一款不错的集成开发环境软件,一般在开发web项目的时候,都要引入相关的jar包,javaee包就是其中一个,有时候其里面的jar包可能与我们需要的不匹配, ...

  7. C++中的默认成员函数

    一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass: ...

  8. Mootools遮罩层练习(原为网上的jquery写法)

    <html > <head> <meta charset="utf-8" /> <title>mootools 遮罩层</ti ...

  9. Oracle数据安全(四)j角色管理

    一.角色管理的概述 1.角色的概念 为了简化数据库权限的管理,在Oracle数据库中引入了角色的概念.所谓的角色就是一系列相关权限的集合. 2.角色的特点 在数据库中,角色的名称必须是唯一的,不能与用 ...

  10. winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能

    一个简单的Demo.百度下载链接:http://pan.baidu.com/s/1sj4oM2h 话不多说,上代码. 1.实体类定义: class Student : INotifyPropertyC ...