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

解:这题的思路有点吊,直接用模式串去匹配文本串就可以了,因为假设一个不是最优的模式串匹配了文本串后 进行删除操作,然后最优的模式串匹配这个文本串时

减少的前缀匹配数量 实际上由以前匹配过的模式串提前加上了 。。。这个思路有点吊

代码:

#include<iostream>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=800005;int a[maxn][26];
int b[maxn];
char str[1000];
int size = 0;
int ans = 0;void init(){size = 0;ans = 0;memset(b,0,sizeof(b));memset(a,0,sizeof(a));
}
void insert(){int len = strlen(str);int root = 0;for (int i = 0; i < len; ++i){int index = str[i] - 'a';if(!a[root][index])a[root][index] = ++size;root = a[root][index];b[root]++;}
}void check(){int len = strlen(str);int root = 0;for (int i = 0; i < len; ++i){int index = str[i] - 'a';if(!a[root][index])break;root = a[root][index];if(b[root])ans++, b[root]--;}
}int main(int argc, char const *argv[]){int n;scanf("%d",&n);for (int i = 0; i < n; ++i){scanf("%s",str);insert();}for (int i = 0; i < n; ++i){scanf("%s",str);check();}printf("%d\n",ans);return 0;
}

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. 刷题总结——分配笔名(51nod1526 trie树)

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

  6. Trie——51nod1526 分配笔名

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

  7. 3764树上的异或值(自己研究的静态字典树)

    题意:       给一颗树,最多10W个点,然后每条边上都有一个权值,任意两点的权值是他们经过的边的异或值,问最大的权值是多少?(任意两点中最大的) 思路:       首先突破口是要想到a^b=c ...

  8. 【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)

    题干: 时间限制:10000ms 单点时限:1000ms 内存限制:512MB 描述 给定一个包含N个单词的字典:{W1, W2, W3, ... WN},其中第i个单词Wi有具有一个权值Vi. 现在 ...

  9. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

最新文章

  1. (十二)Flask 学习 —— 换装
  2. 如何与人交流——程序员,赶紧生个孩子吧!
  3. k8s之informer简单理解
  4. SAP CRM后台取数据逻辑的性能优化
  5. inputstream读取html乱码,java InputStream 读取汉语言内容的解决乱码
  6. shell--基本语法
  7. php array =,PHP Array 函数
  8. 联想r720内存频率_联想小新Pro 14 2021怎么样 联想小新Pro 14 2021全面评测
  9. python安装you—get_使用Python下载工具you-get下载媒体文件
  10. 【零基础学Java】—重写(二十)
  11. python利器-python利器去广告版
  12. 好用的Tab菜单切换标签
  13. 记录一个SetupFactory使用手册
  14. AXURE母版事件(Raised-events)
  15. PHP制作QQ微信支付宝三合一收款码
  16. 我建议你自己写一个疫情数据监控
  17. Spring Cloud GateWay-过滤器
  18. Vim文件和日历操作
  19. Python 练习实例100-39,有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  20. MySQL-pymysql模块

热门文章

  1. 360 度考核的定义和示例
  2. 全新剪映专业版140内测版!等你体验!
  3. 惠普136w耗材贵吗_性价比利器 惠普MFP 136w轻体验
  4. code回归采访哭 ladies_LADIES’CODE再次提到高恩妃和权梨世的车祸事故 在节目中流泪...
  5. 机器学习讲堂 ACF 聚合通道检测
  6. Python学习Day17
  7. 【牛津大学博士论文】关系数据的学习和推理
  8. Openwrt Kernel panic - not syncing: Fatal exception 解决方案
  9. Go语言 - 并发控制
  10. 计算机二级各个科目的区别,计算机二级考试的各个科目的内容及区别