1526 分配 笔名

题目来源:  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

 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 分配 笔名相关推荐

  1. 51nod 1526 分配笔名(字典树)

    1526 分配笔名 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题  收藏  关注 班里有n个同学.老师为他们选了n个笔名.现在 ...

  2. 51nod 1526 分配笔名

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

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

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

  4. 51NOD P1526 分配笔名

    ORZ ZYY 首先建立trie树,是名字打标机+1,是笔名的话打标机-1 然后贪心爆搜,如果当前和儿子标机不同就加上,记得标机要上传 然后最后一组数据特判掉吧 #include<iostrea ...

  5. Trie——51nod1526 分配笔名

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1526 这题主线思路肯定是Trie对吧 定义笔名和真名之间的相关度是他们 ...

  6. 51nod1526 分配笔名 trie+贪心

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

  7. 刷题总结——分配笔名(51nod1526 trie树)

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

  8. trie-51nod1526 分配笔名

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1526 狗题: 卡我内存6mb: 所以我只有95分: 好像用指针,用结构体 ...

  9. 51nod-1526: 分配笔名

    [传送门:51nod-1526] 简要题意: 给出n个真名和笔名,都是字符串 要求n个真名和笔名一一匹配,一个真名和一个笔名所带来的价值是这两个字符串的最长公共前缀 题解: 直接将真名和笔名插进字典树 ...

最新文章

  1. 计算机桌面文件夹删除如何找回,电脑删除文件如何恢复 误操作的一剂后悔药...
  2. 修改altium designer原理图右下角信息
  3. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
  4. AcWing 3195. 有趣的数
  5. NanShan作者:风景未变人已变
  6. resin4 发布war包
  7. 2017计算机基础教学大纲,2017级大学计算机基础教学大纲
  8. 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
  9. 07. (附加)用两个队列实现栈(C++版本)
  10. win10更改登录密码
  11. 域名转换网址中文网址转换_大转变:域名转换工作清单,第1部分
  12. R语言回归分析-改进异常值
  13. android 手机强制关机代码,安卓手机如何强制关机?安卓手机强制关机方法[多图]...
  14. (六)改掉这些坏习惯,还怕写不出精简的代码?
  15. java电话正则屏蔽_java针对电话号码正则匹配实例
  16. 待我代码编成 娶你为妻可好
  17. 欧几里德算法(求两数最大公因数)
  18. 根据地址智能识别省市县/区
  19. cfa可以用计算机吗,CFA考试
  20. 糖尿病足溃疡疗法行业调研报告 - 市场现状分析与发展前景预测

热门文章

  1. 如何用C语言写出一棵树(结构想法分享)
  2. 移动端(vue)如何调用手机拨号功能
  3. VUE3(八)setup与ref函数
  4. rsync + inotify 同步数据
  5. 东芝固态硬盘工具for linux,不止Windows!东芝RC500苹果MacOS系统体验
  6. Python读取xls表格内容
  7. 绝地求生:全军出击今日正式服上线,用电脑来玩手游的方法
  8. Softmax损失函数
  9. Python基础:标准库和常用的第三方库
  10. Android仿微信底部菜单栏+今日头条顶部导航栏