P2814 家谱

题目背景

现代的人对于本家族血统越来越感兴趣。

题目描述

给出充足的父子关系,请你编写程序找到某个人的最早的祖先。

输入输出格式

输入格式:

输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。

输出格式:

按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。

输入输出样例

输入样例#1:

#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出样例#1:

Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur

说明

规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。

/*
感觉这题应该是noipT1难度,hash成一个数然后当成一个点记录出度,因为一个人的父亲只可能有一个,所以直接模拟即可,但是最后两个点TLE
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 2333333
int cnt,map[],du[],to[];
bool vis[];
char s[][],ch[];
int ha(char c[]){
int res=;
for(int i=;i<=;i++)
res=(res*%mod+(ch[i]-'A'+)*%mod)%mod;
return res;
}
int main(){
//freopen("Cola.txt","r",stdin);
scanf("%s",ch);
int now,cur;
while(){
if(ch[]=='$')break;
cur=ha(ch);
if(!vis[cur]){
cnt++;
for(int i=;i<;i++)s[cnt][i]=ch[i+];
map[cur]=cnt;
vis[cur]=;
}
if(ch[]=='#'){
int fa=cur;
while(){
scanf("%s",ch);
if(ch[]!='+')break;
int now=ha(ch);
if(!vis[now]){
cnt++;
for(int i=;i<;i++)s[cnt][i]=ch[i+];
map[now]=cnt;
vis[now]=;
}
to[now]=fa;
du[now]++;
}
}
if(ch[]=='?'){
now=ha(ch);
//map[now]=cnt;
cout<<s[map[now]]<<' ';
while(){
if(du[now]==)break;
now=to[now];
}
cout<<s[map[now]]<<endl;
scanf("%s",ch);
}
}
}

80分 TLE

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 2333333
int cnt,map[],zu[];
bool vis[];
char s[][],ch[];
int ha(char c[]){
int res=;
for(int i=;i<=;i++)res=(res*+ch[i]-'A'+)%mod;
return res;
}
int main(){
scanf("%s",ch);
int now,cur;
for(int i=;i<=;i++)zu[i]=i;
while(){
if(ch[]=='$')break;
cur=ha(ch);
if(!vis[cur]){
cnt++;
for(int i=;i<;i++)s[cnt][i]=ch[i+];
map[cur]=cnt;
vis[cur]=;
}
if(ch[]=='#'){
int fa=cur;
while(){
scanf("%s",ch);
if(ch[]!='+')break;
int now=ha(ch);
if(!vis[now]){
cnt++;
for(int i=;i<;i++)s[cnt][i]=ch[i+];
map[now]=cnt;
vis[now]=;
}
zu[map[now]]=zu[map[fa]];
}
}
if(ch[]=='?'){
now=ha(ch);
cout<<s[map[now]]<<' ';
cout<<s[zu[map[now]]]<<endl;
scanf("%s",ch);
}
}
}

另附更改之后WA成50分的代码

#include<bits/stdc++.h>
using namespace std;
map<string,string>father;
string fat(string x){//找爸爸
if(x!=father[x])
father[x]=fat(father[x]);
return father[x];
}
int main(){
char k;
string f1,t;
while(){
cin>>k;
if(k=='$') break;
if(k=='#'){
cin>>f1;
if(father[f1]=="") father[f1]=f1;
continue;
}
else if(k=='+'){
cin>>t;
father[t]=f1;
}
else if(k=='?'){
cin>>t;
cout<<t<<' '<<fat(t)<<endl;
}
}
return ;
}

100分 map+并查集

洛谷P2814 家谱的更多相关文章

  1. 洛谷——P2814 家谱

    P2814 家谱 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系 ...

  2. 洛谷 P2814 家谱(gen)

    题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...

  3. 洛谷 P2814 家谱

    题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...

  4. 洛谷P2814 家谱(gen)

    题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...

  5. c++并查集配合STL MAP的实现(洛谷P2814题解)

    不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...

  6. 家谱(gen)——洛谷P2814

    #include <iostream> #include <string> #include <map> using namespace std; map < ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. 怎样避免C#中将小数转换为字符串时出现科学记数法

    在C#中如果float.double.decimal类型的值,小数点后的0太多时,C#会用科学记数法来表示小数的值. 例如下面的double类型0.00009,如果我们直接将其用ToString()方 ...

  2. 剑指Offer:对称的二叉树【28】

    剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* publi ...

  3. 微信小程序开发:学习笔记[5]——JavaScript脚本

    微信小程序开发:学习笔记[5]——JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来 ...

  4. docker 常用命令整理

    1.查看镜像 docker images 2.查看所有状态的容器 docker ps -a 3.运行容器 docker exec -it  container /bin/bash docker att ...

  5. poj2965 The Pilots Brothers' refrigerator —— 技巧性

    题目链接:http://poj.org/problem?id=2965 题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了.网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面 ...

  6. layer 插件 在子页面关闭自身的方法

    先取到该子页面在父级页面中的name 值 var  index= parent.layer.getFrameIndex(Window.name); 然后用该方法关闭 parent.layer.clos ...

  7. 分享知识-快乐自己:Hibernate对象的三种状态

    图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...

  8. Meta viewport 学习整理

    The meta viewport tag contains instructions to the browser in the matter of viewports and zooming. I ...

  9. java面试题07

    1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...

  10. 休假回来 更博-MySQL以月为单位的客户综合情况表_20161008

    十一休假老家事比较多 未来得及更新 今起依旧更博- 生成一个以用户ID为单位,各月下单天次,各月买了几个产品,各月订单额 ,天次,,天次,,天次,NULL)) AS 9月天次 FROM ( SELEC ...