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. 利用wxpython显示OpenCV图像

    核心代码 import wx, cv2 import numpy as np # Start with a numpy array style image I'll call "source ...

  2. 设置sudo的过期时间

    默认sudo的过期时间过短,经常要输入密码 sudo visudo Defaults env_reset找到这行代码 后面加上timestamp_timeout参数,数值是分钟 ,timestamp_ ...

  3. 剑指Offer:二叉树中和为某一值的路径【34】

    剑指Offer:二叉树中和为某一值的路径[34] 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. ...

  4. 常见的CSS命名

    1:header(头部)logo  topbar lang search topmenu banner nav headbox active(活动的) selectselectTop selectLi ...

  5. storm源码剖析(2):storm的配置项

    storm的配置项,可以从backtype/storm/Config.java中找到所有配置项及其描述

  6. 《java编程思想》:第五章,初始化与清理

    知识点整理: 1.从概念上讲,‘初始化’与‘创建’是彼此独立的,但是在Java中,两者被捆绑在一起,不可分离. 2.区分重载的方法:每个重载的方法都有一个独一无二的参数类型列表. 甚至参数顺序的不同也 ...

  7. linux命令学习笔记(45):free 命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的 工具中,free命令是最经常使用的命令之一. .命令格式: free [参 ...

  8. loading bar

    上面的loading条,想到的办法是用两个半圆覆盖实现,结果也就这么做了,可是明明一个圆就可以的,哎智商堪忧... <!DOCTYPE html> <html lang=" ...

  9. 国内镜像pip

    建议非清华大学校内的使用这个镜像: http://e.pypi.python.org/simple(这也是一个http://pypi.v2ex.com/simple),清华校内的就使用这个:http: ...

  10. 51nod_1236_序列求和 V3 _组合数学

    51nod_1236_序列求和 V3 _组合数学 Fib(n)表示斐波那契数列的第n项,Fib(n) = Fib(n-1) + Fib(n-2).Fib(0) = 0, Fib(1) = 1. (1, ...