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. String源码中hashCode算法

    针对java中String源码hashcode算法源码分析 /** The value is used for character storage. */ private final char val ...

  2. Android Weekly Notes Issue #275

    Android Weekly Issue #275 September 17, 2017 Android Weekly Issue #275 本期内容包括给Google Map实现一个Marker A ...

  3. TopCoder<SRM>上的一道1100分的题目解析附代码

    首先我们来简单看一下这道题的statement Problem Statement      Note that in the following problem statement, all quo ...

  4. python关于文件路径和文件名的操作

    os.path.abspath(path) #返回绝对路径(包含文件名的全路径) os.path.basename(path) —— 去掉目录路径获取文件名 os.path.dirname(path) ...

  5. html 转字符串换成代码

    1. [文件] htmlToCode.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. html5实现进度条功能效果非常和谐

    1. [图片] html5.jpg ​2. [代码][HTML]代码  <script type="text/javascript">    var i = 0;    ...

  7. poj 2689Prime Distance(区间素数)埃氏筛法

    这道题的L和R都很大,所以如果直接开一个1~R的数组明显会超时.但是R-L并不大,所以我们考虑把这个区间(L--R)移动到(1--(R-L+1))这个区间再开数组(就是把每个数减L再加1).接下来先用 ...

  8. vue文件名规范

    之前有看过一些命名规范,也看到说vue文件命名要么全是小写要么就是用小写 + '-':其实看到的时候有点不以意,因为本地能跑起项目:发布能正常访问也就OK了. 但是今天在做自动化部署的时候碰到一个问题 ...

  9. javacpp-FFmpeg系列之3: 像素图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转,BufferdImage转Base64编码)

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  10. Out of resources when opening file ‘./xxx.MYD’ (Errcode: 24)解决方法

    今天朋友向我反映网站出现错误:Out of resources when opening file './xxx.MYD' (Errcode: 24)错误是因为打开的文件数超过了my.cnf的--op ...