51nod-1526-贪心+Trie
班里有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
很容易想到一个贪心的算法是,对于每一个笔名,把他用在使得他贡献最大的人身上,字符串前缀最大,数据量又很大,考虑使用字典树把人名存下,用笔名在树上匹配。思路是对的但出了一个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的更多相关文章
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- 51nod 1526 分配笔名(字典树+贪心)
题意: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...
- 51nod 1163贪心
用优先队列来贪心,是一个很好地想法.优先队列在很多时候可以维护最值,同时可以考虑到一些其他情况. http://www.51nod.com/onlineJudge/questionCode.html# ...
- 【贪心/Trie】【CF1083B】 The Fair Nut and Strings
Description 有 \(k\) 个长度为 \(n\) 的只含 \(a\) 或 \(b\) 字符串,并不知道它们具体是多少,只知道它们的字典序不小于字符串 \(A\),同时不大于字符串 \(B\ ...
- 51nod 1625 贪心/思维
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 1625 夹克爷发红包 基准时间限制:1 秒 空间限制:13107 ...
- 51nod 1099 贪心/思维
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1099 1099 任务执行顺序 基准时间限制:1 秒 空间限制:13107 ...
- 51nod 1428 贪心
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活动安排问题 基准时间限制:1 秒 空间限制:13107 ...
- [bzoj4567][Scoi2016][背单词] (贪心+trie树)
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- BZOJ 1954: Pku3764 The xor-longest Path(贪心+trie)
传送门 解题思路 \(trie\)的一个比较经典的应用,首先把每个点到根的异或和算出,然后建一棵\(trie\)把所有权值插入到\(Trie\)中,之后枚举所有结点,在\(Trie\)上贪心的跑统计答 ...
- Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)
题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...
随机推荐
- myeclipse部署web项目部署按钮无效
找到MyEclipse的工作路径,我的是“E:\Java”,到这个目录中去“\.metadata\.plugins\org.eclipse.core.runtime\.settings”找一个含有de ...
- 深入理解Mysql索与事务隔离级别
1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...
- 转!java产生不重复随机数
private static void testC(int sz) { long startTime = System.currentTimeMillis(); //开始测试时间 Random rd ...
- IIS设置文件 App_Offline.htm 网站维护
在ASP.NET 2.0 站点根目录下,只要存在 App_Offline.htm 文件,那么所有对.aspx的请求都将转向App_Offline.htm .而且浏览器的地址栏显示的是所请求的.aspx ...
- python3 基础数据类型
一.基础数据类型分类 python的数据类型主要包括以下几种: 1.数字 2.字符串 3.列表 4.字典 5.元组 6.集合 1.数字 int 数字主要是用于计算用的,使用方法并不多 #bit_len ...
- 012-JDK可视化监控工具-jstack
一.概述 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- 002-使用java类调用quartz
一.工具类 package com.tech.jin.jobScheduler; import java.text.ParseException; import java.util.ArrayList ...
- django【自定义分页】
1. views.py def app(request): page_info = PageInfo(request.GET.get('p'), 6, 100, request.path_info, ...
- cdoj 秋实大哥搞算数
地址:http://acm.uestc.edu.cn/#/contest/show/95 题目: N - 秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others) ...
- 筛选最新生成的报告——sort
筛选出最新报告发送,返回报告路径 import os def filePath(path): return os.path.join(os.path.abspath(os.path.dirname(o ...