题目链接:点击查看

题目大意:给出n个学生的真实姓名和n个假名,问怎样匹配能使lcp总和最大,lcp是指最大相同前缀长度

题目分析:这个题一开始是没有思路的,但看到前缀并且数据还这么大,肯定是和字典树脱不了干系的,但最后还是没有合适的想法来解决这个问题,看了一下zx学长的代码后就明白了,一种类似于贪心的策略,让前缀尽可能长的字符串先匹配,那我们该如何用字典树实现呢?关于字典树的每个节点,我们可以多存储一点信息,那就是能够到达当前节点的字符串的编号,用vector就可以搞定,有了这样一个信息,在建完树后,因为字典树也是树状结构,所以我们可以用dfs或bfs进行遍历,这个题目因为需要回溯,所以我们选择使用dfs进行遍历,先跑到树的最深层,也就是叶子结点,这个时候若名字和假名的id可以匹配的话,那肯定是最优解,因为此时的前缀序列最长,我们就遍历一遍当前节点下所有的名字序号和假名序号,让他们一一匹配即可,记得用布尔数组vis辅助标记,防止二次匹配,当前深度的所有节点匹配完毕后,就可以回溯到上一层去了,也算是一种贪心的策略

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e6+100;char s[N];vector<int>a[N],b[N];int trie[N][26];int cnt=0;bool visa[N],visb[N];int sum=0;vector<pair<int,int>>ans;void insert(vector<int> a[],int id)
{int pos=0;a[pos].push_back(id);for(int i=0;s[i];i++){int to=s[i]-'a';if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];a[pos].push_back(id);}
}void dfs(int pos,int deep)
{for(int i=0;i<26;i++)if(trie[pos][i])dfs(trie[pos][i],deep+1);for(int i=0;i<a[pos].size();i++){if(visa[a[pos][i]])continue;for(int j=0;j<b[pos].size();j++){if(visb[b[pos][j]])continue;visa[a[pos][i]]=visb[b[pos][j]]=true;sum+=deep;ans.push_back(make_pair(a[pos][i],b[pos][j])); break;}}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);insert(a,i);}for(int i=1;i<=n;i++){scanf("%s",s);insert(b,i);}dfs(0,0);printf("%d\n",sum);for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second);return 0;
}

CodeForces - 566A Matching Names(字典树上贪心)相关推荐

  1. CodeForces - 965E Short Code (字典树上贪心)

    题目链接:点击查看 题目大意:给出n个互不相同的字符串,现在要求n个互不相同的前缀,问所有前缀的长度和最短是多少 题目分析:因为涉及到了前缀,所以我们可以用字典树来解决,又因为需要长度和最短,所以我们 ...

  2. CF 566A Matching Names

    CF 566A Matching Names 题目描述 给出n个名字和n个昵称,求一个名字和昵称的劈配方案,使得被劈配的名字和昵称的最长公共前缀长度的和最大. 1<=n<=100000 字 ...

  3. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  4. Codeforces Round #665 (Div. 2) Maximum Distributed Tree(树上贪心)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF1401D Maximum Distributed Tree(树上贪心) 给定一棵 nnn 个节点 ...

  5. hdu4825 字典树 + 贪心

    题意:       给你n个数,然后给你m组询问,每组询问给你一个数,输出n个数中与该数亦或 的最大的那个数,输出的是被亦或的那个数,不是亦或后的结果. 思路:       我用的是字典树+贪心,首先 ...

  6. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting

    题目链接 题目大意: 就是给你nnn个数,mmm次询问 每次询问给你l,r,a,bl,r,a,bl,r,a,b问你在[l,r][l,r][l,r]区间里面有多少种种种数c(XOR)a≤bc(XOR)a ...

  7. CodeForces - 1417E XOR Inverse(字典树求逆序对+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在要求选出一个 x,将 a 中的每个元素都异或之后得到一个新的数列 b,要求数列 b 的逆序对最小,问最小的逆序对是多少,x 该如何选择 ...

  8. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  9. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

最新文章

  1. 最佳SQL Server 2008入门教程
  2. python 操作fit文件图像
  3. 计算机原理与基础 —— 原码、反码、补码之间的快速转换和简单运算
  4. 几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
  5. ci中如何得到配置的url
  6. 微信无连接服务器1.104,微信成语猜猜看太子少师答案汇总 太子少师1-104关攻略...
  7. 使用Elasticsearch和C#理解和实现CRUD APP的初学者教程——第2部分
  8. 吴恩达深度学习CNN作业:Convolutional Neural Networks: Application
  9. 图片切换ajax,jQuery AJAX全屏图文幻灯切换
  10. 博文视点在SD2.0大会上以书会友
  11. excel图表交互联动_Excel图表联动的三种方法
  12. Intellij中Maven项目html页面乱码解决方案
  13. Pr:Lumetri 颜色
  14. QTimer::singleShot
  15. 揭秘封包辅助外G:封包外G初体验(四)
  16. Linux配置访问服务器图片路径(防止踩坑)
  17. 停止在csdn发文及上传资源的声明
  18. 高等数学笔记:留数法
  19. cmake简洁教程 - 第五篇
  20. PPT分享:基于Eventuate平台解决微服务架构难题

热门文章

  1. Nacos-Nacos和Eureka的对比
  2. Docker生成镜像的两种方式
  3. OAuth2.0授权码认证流程介绍
  4. SpringBoot高级-消息-RabbitMQ安装测试
  5. 设计模式------观察者模式
  6. JAVA中ListIterator和Iterator详解与辨析
  7. JavaFX 中 FX 一词的由来
  8. ‘复杂变简单‘的代码例子
  9. PyTorch深度学习实践06
  10. windows下mysql的数据备份