51nod 1526 分配笔名(字典树+贪心)
题意:
班里有n个同学。老师为他们选了n个笔名。现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学。现在定义笔名和真名之间的相关度是他们之间的最长公共前缀。设笔名为a,真名为b,则他们之间的相关度为lcp(a,b)。那么我们就可以得到匹配的质量是每一个同学笔名和真名之间相关度的和。
现在要求分配笔名,使得匹配质量最大。
题解:
对于真名建立一个字典树,然后每个笔名在字典树上打一个标记
然后就变成了贪心,每个点的标记看是否能被字典树上的单词消掉,不能消,就让标记往上走即可。
这里。。有一组深度特别深的数据
dfs会内存超限,所以加了个特判(实际上。。应该用非递归的形式写比较好)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 8e5 + ;
int trans[maxn][], v[maxn], lab[maxn];
int tot;
long long ans;
void Insert(char *S){
int n = strlen(S), x = ;
for(int i = ; i < n; i++){
int ch = S[i] - 'a';
if(trans[x][ch] == ) trans[x][ch] = ++tot;
x = trans[x][ch];
}
v[x]++;
} void Change(char *S){
int n = strlen(S), x = ;
for(int i = ; i < n; i++){
int ch = S[i] - 'a';
if(trans[x][ch] == ) break;
x = trans[x][ch];
}
lab[x]++;
} void dfs(int x, int d){
if(d >= 5e5) { cout<<<<endl; exit();}
for(int i = ; i < ; i++){
int to = trans[x][i];
if(to == ) continue;
dfs(to, d+);
v[x] += v[to];
lab[x] += lab[to];
}
if(v[x] >= lab[x]){
ans += d*lab[x];
v[x] -= lab[x];
lab[x] = ;
} else {
ans += d*v[x];
lab[x] -= v[x];
v[x] = ;
}
}
int n;
char str[maxn]; int main()
{
cin>>n;
for(int i = ; i <= n; i++){
scanf("%s", str);
Insert(str);
}
for(int i = ; i <= n; i++){
scanf("%s", str);
Change(str);
}
dfs(, );
cout<<ans<<endl;
return ;
}
51nod 1526 分配笔名(字典树+贪心)的更多相关文章
- 51nod 1526 分配笔名
题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题. 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一 ...
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- HDU 4825 Xor Sum(经典01字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- NEUOJ711 异星工厂 字典树+贪心
题意:你可以收集两个不相交区间的权值,区间权值是区间异或,问这两个权值和最大是多少 分析:很多有关异或求最大的题都是利用01字典树进行贪心,做这个题的时候我都忘了...最后是看别人代码的时候才想起来这 ...
- HDU 5536 Chip Factory 字典树+贪心
给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...
- hdu4825 01字典树+贪心
从高位向低位构造字典树,因为高位得到的数更大. AC代码: #include<cstdio> using namespace std; typedef long long LL; cons ...
- ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)
题目链接:http://poj.org/problem?id=3764 题目大意是在树上求一条路径,使得xor和最大. 由于是在树上,所以两个结点之间应有唯一路径. 而xor(u, v) = xor( ...
- Codeforces 706 D. Vasiliy's Multiset (字典树贪心)
题目链接:http://codeforces.com/contest/706/problem/D 题意很简单不多说. 把一个数当作二进制插入字典树中,按照xor的性质,1找0,0找1,贪心即可. 注意 ...
- HDU4825(字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
随机推荐
- CF833E Caramel Clouds
题面 天上有$n$朵云,每朵云$i$会在时间$[l_i,r_i]$出现,你有$\text C$个糖果,你可以花费$c_i$个糖果让云$i$消失,同时需要保证你最多让两朵云消失.现在有$m$个独立的询问 ...
- crontab练习题
Crontab练习题 每周一到周六的凌晨3点20分,运行tar命令对/etc/目录进行存档另存,存储位置为/backups/etc-YYYY-MM-DD.tar.gz 20 3 * * 1-6 /us ...
- 前端--再遇jQuery
一.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回第一个属性) attr(属性名|属性值) --一个参数是获取属性的值,两个参数是设置属性值 --点击图片加载示例 removeAttr(属 ...
- 软考之信息安全工程师(包含2016-2018历年真题详解+官方指定教程+VIP视频教程)
软考-中级信息安全工程师2016-2018历年考试真题以及详细答案,同时含有信息安全工程师官方指定清华版教程.信息安全工程师高清视频教程.持续更新后续年份的资料.请点赞!!请点赞!!!绝对全部货真价实 ...
- flask_sqlalchemy介绍
快速入门 Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展.有关完整的指南,请参阅 SQLAlchemy 的 API 文档. 一个最小应用 常见情 ...
- join 中的on和where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表, 然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1.on条件是在生成临时表时使用的条 ...
- html页面中完成查找功能
最近在搞一个被很多人改了的框架,天天看代码看的头的晕了,不过感觉进步还挺大的,自己做了一个后台可配置前台查看两个库不同数据范围的东西,还挺满意,那天拿出来分享一下,今天先说一个这几天做的功能,就是ht ...
- [咸恩静][Coffee House]
歌词来源:http://music.163.com/#/song?id=5400159 하루의 시작은 향긋한 커피 [ha-lu-e xi-ja-geun hyang-geu-Tan Keo-Pi] ...
- Java微笔记(5)
final关键字 super关键字
- java复利计算基本代码
源代码: public class Calculate { public static void main(String[] args){ double money = 1000; //本金 int ...