hihocoder #1335 : Email Merge(map+sort)
传送门
题意
分析
每次插入人名与邮箱的时候,做一次并查集,然后做一次sort即可
trick
3
a 1 first@hihocoder.com
b 1 second@hihocoder.com
c 2 first@hihocoder.com second@hihocoder.com
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int n,m;
struct node
{
int depth,fa;//节点深度及父亲/编号
string name;
node(const string &str,int depth,int id):name(str),depth(depth),fa(id){}
bool operator<(const node &p)const
{
return (fa==p.fa)?depth<p.depth:fa<p.fa;//按父亲排序,再按深度排序
}
};
vector<node>point;//记录所有的点
int find(int u){ return (point[u].fa==u)?u:point[u].fa=find(point[u].fa); }
void merge(int u,int v)
{
int fu=find(u),fv=find(v);
if(fu!=fv)
{
if(point[fu].depth>point[fv].depth) swap(fu,fv);
}
point[fv].fa=fu;
}
char buf[10010];
unordered_map<string,int>mp;//hash_map返回字符串对应的id
int get_id(const string &buf,int time)//获取id
{
if(mp.count(buf)) return mp[buf];
int sz=mp.size();
point.push_back(node(buf,time,sz));
return mp[buf]=sz;
}
vector<int>user;
int main()
{
scanf("%d",&n);
int tot=0;
F(i,1,n)
{
scanf("%s",buf);
int u=get_id(buf,tot++);
user.push_back(u);
scanf("%d",&m);
F(j,1,m)
{
scanf("%s",buf);
int v=get_id(buf,tot++);
merge(u,v);//将人名与邮箱相连接
}
}
for(auto u:user) find(u);//对于每个人名都做一次并查集
vector<node>ans;
for(auto u:user) ans.push_back(point[u]);
sort(ans.begin(),ans.end());//排序
for(int u=0;u<n;++u)
{
printf("%s",ans[u].name.c_str() );
if(u<n-1&&ans[u].fa==ans[u+1].fa) putchar(' ');
else putchar('\n');
}
return 0;
}
hihocoder #1335 : Email Merge(map+sort)的更多相关文章
- [大牛翻译系列]Hadoop(5)MapReduce 排序:次排序(Secondary sort)
4.2 排序(SORT) 在MapReduce中,排序的目的有两个: MapReduce可以通过排序将Map输出的键分组.然后每组键调用一次reduce. 在某些需要排序的特定场景中,用户可以将作业( ...
- 分布式基础学习(2)分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...
- 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...
- 斗地主的综合案例实现(Map有序)
斗地主的综合案例实现(Map有序) 整体思路 代码实现 import java.util.ArrayList; import java.util.Collections; import java.ut ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- hihoCoder 1432 : JiLi Number(吉利数)
hihoCoder #1432 : JiLi Number(吉利数) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 Driver Ji l ...
- 堆排序(Heap Sort)的C语言实现
堆排序(Heap Sort)具体步骤为 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆 将顶部元素与堆尾数组交换,此是末尾元素就是最大值, ...
- 快速排序(Quick Sort)的C语言实现
快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...
- 排序算法 (sorting algorithm)之 冒泡排序(bubble sort)
http://www.algolist.net/Algorithms/ https://docs.oracle.com/javase/tutorial/collections/algorithms/ ...
随机推荐
- Memcached服务端自动启动(转载)
Memcached服务端自动启动 原文链接:http://www.cnblogs.com/technet/archive/2011/09/11/2173485.html 经测试,要使得Memcach ...
- SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第二天任务攻略
眼看实验室就要关门了.走之前写一下解题过程(事实上大家都等着第三题出来吧大概-=). 高速传送门:http://segmentfault.com/game/2 那么接昨天的博客,今天的题目是这种: 完 ...
- 封装EF code first用存储过程的分页方法
一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...
- Graphics and Animation in iOS
using System;using UIKit;using CoreGraphics;using Foundation; namespace GraphicsAnimation{ public c ...
- 生成ssh密钥
打开Git Bash,生成ssh密钥: ssh-keygen -t rsa -C "your_email@youremail.com"
- Mixtures of Gaussians and the EM algorithm
http://cs229.stanford.edu/ http://cs229.stanford.edu/notes/cs229-notes7b.pdf
- UI标签库专题四:JEECG智能开发平台 Upload(上传标签)
1. Upload(上传标签) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 id string 上传控件唯一标示 是 null name string 控件name 是 null ...
- linux环境下安装的activemq的输出日志
activemq输出日志的位置: activemq/data/activemq.log 查看activemq.log文件即可.
- linux CentOS7.2安装ffmpeg-3.0.2
ffmpeg是一款视频处理软件,在php5.5前以php_ffmpeg.dll扩展的方式存在,通过网上查资料显示,从php5.5以后不支持该扩展了.那么在linux系统下安装ffmpeg.方法如下: ...
- Zygote进程介绍【转】
本文转载自:http://blog.csdn.net/yangwen123/article/details/17258023 Zygote进程介绍 在Android系统中,存在不同的服务,这些服务 ...