51Nod 1526 分配 笔名
1526 分配 笔名
![](https://file.51nod.com/images/icon/star.png)
![](https://file.51nod.com/images/icon/plus.png)
班里有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)
单组测试数据。 第一行有一个整数n (1≤n≤100000),表示班级中同学的数目。 接下来n行,表示每一个同学的真名,每一个名字是非空串,且由小写字母组成。 名字可能重复。 最后n行是老师已经安排好的笔名。每一个笔名是一个非空串,且由小写字母组成。 笔名可能重复。 输入的字符总数目不超过 800000。
输出最大的匹配质量。
样例输入1 5 gennady galya boris bill toshik bilbo torin gendalf smaug galadriel
样例输出1 11
![](/assets/blank.gif)
![](/assets/blank.gif)
1 /* 2 乱搞 3 我们可以先用真名建一颗字典树, 4 然后用笔名在字典树上匹配,标记大于0则 ans++,标记-1 5 不明原理。。。 6 */ 7 #include <cstdio> 8 #include <cstring> 9 10 const int MAXN=1000010; 11 12 char s[MAXN][11],q[MAXN][11]; 13 14 int n,tot,ans; 15 16 int t[MAXN][27],sum[MAXN]; 17 18 inline void build(int cnt) { 19 int now=0; 20 int len=strlen(s[cnt]); 21 for(int i=0;i<len;++i) { 22 int x=s[cnt][i]-'a'+1; 23 if(!t[now][x]) t[now][x]=++tot; 24 now=t[now][x]; 25 ++sum[now]; 26 } 27 return; 28 } 29 30 inline void find(int cnt) { 31 int now=0; 32 int len=strlen(q[cnt]); 33 for(int i=0;i<len;++i) { 34 int x=q[cnt][i]-'a'+1; 35 if(!t[now][x]) break; 36 now=t[now][x]; 37 if(sum[now]) ++ans,--sum[now]; 38 } 39 return; 40 } 41 42 int hh() { 43 scanf("%d",&n); 44 for(int i=1;i<=n;++i) scanf("%s",s[i]),build(i); 45 for(int i=1;i<=n;++i) scanf("%s",q[i]),find(i); 46 printf("%d\n",ans); 47 return 0; 48 } 49 50 int sb=hh(); 51 int main() {;}
题解
51Nod 1526 分配 笔名相关推荐
- 51nod 1526 分配笔名(字典树)
1526 分配笔名 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 班里有n个同学.老师为他们选了n个笔名.现在 ...
- 51nod 1526 分配笔名
题意 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名为 ...
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- 51NOD P1526 分配笔名
ORZ ZYY 首先建立trie树,是名字打标机+1,是笔名的话打标机-1 然后贪心爆搜,如果当前和儿子标机不同就加上,记得标机要上传 然后最后一组数据特判掉吧 #include<iostrea ...
- Trie——51nod1526 分配笔名
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1526 这题主线思路肯定是Trie对吧 定义笔名和真名之间的相关度是他们 ...
- 51nod1526 分配笔名 trie+贪心
Description 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长 ...
- 刷题总结——分配笔名(51nod1526 trie树)
题目: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...
- trie-51nod1526 分配笔名
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1526 狗题: 卡我内存6mb: 所以我只有95分: 好像用指针,用结构体 ...
- 51nod-1526: 分配笔名
[传送门:51nod-1526] 简要题意: 给出n个真名和笔名,都是字符串 要求n个真名和笔名一一匹配,一个真名和一个笔名所带来的价值是这两个字符串的最长公共前缀 题解: 直接将真名和笔名插进字典树 ...
最新文章
- 计算机桌面文件夹删除如何找回,电脑删除文件如何恢复 误操作的一剂后悔药...
- 修改altium designer原理图右下角信息
- 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
- AcWing 3195. 有趣的数
- NanShan作者:风景未变人已变
- resin4 发布war包
- 2017计算机基础教学大纲,2017级大学计算机基础教学大纲
- 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
- 07. (附加)用两个队列实现栈(C++版本)
- win10更改登录密码
- 域名转换网址中文网址转换_大转变:域名转换工作清单,第1部分
- R语言回归分析-改进异常值
- android 手机强制关机代码,安卓手机如何强制关机?安卓手机强制关机方法[多图]...
- (六)改掉这些坏习惯,还怕写不出精简的代码?
- java电话正则屏蔽_java针对电话号码正则匹配实例
- 待我代码编成 娶你为妻可好
- 欧几里德算法(求两数最大公因数)
- 根据地址智能识别省市县/区
- cfa可以用计算机吗,CFA考试
- 糖尿病足溃疡疗法行业调研报告 - 市场现状分析与发展前景预测