洛谷P2814 家谱
P2814 家谱
题目背景
现代的人对于本家族血统越来越感兴趣。
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入输出格式
输入格式:
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。
输出格式:
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。
输入输出样例
#George
+Rodney
#Arthur
+Gareth
+Walter
#Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
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 家谱的更多相关文章
- 洛谷——P2814 家谱
P2814 家谱 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系 ...
- 洛谷 P2814 家谱(gen)
题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...
- 洛谷 P2814 家谱
题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...
- 洛谷P2814 家谱(gen)
题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组 ...
- c++并查集配合STL MAP的实现(洛谷P2814题解)
不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...
- 家谱(gen)——洛谷P2814
#include <iostream> #include <string> #include <map> using namespace std; map < ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- php+mysql 安全
Php注入攻击是现今最流行的攻击方式,依靠它强大的灵活性吸引了广大黑迷. 在上一期的<php安全与注射专题>中林.linx主要讲述了php程序的各种漏洞,也讲到了php+mysql注入的问 ...
- SpringBoot学习笔记(12):计划任务
SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...
- 在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5 ,PHP5.6)支持。
本人预装了一个wamp的集成环境(Apache 2.4.9 + PHP 5.5.12 + mysql 5.6.17),今天在wamp环境下 添加PHP多版本 (PHP 5.5.30).中间两个过程,1 ...
- Linux常用命令全集
一,安装和登陆命令1,进入图形界面 startx 2,进入图形界面 init 5 3,进入字符界面 init 34,登陆 login 5,关机 poweroff -p 关闭机器的时候关闭电源-n 在关 ...
- shell将字符串转换为大写变量并将小写作为变量值
group_name='a b c d e f g' for a in $group_name; do typeset -u a ; echo "$a='$(echo $a | tr '[A ...
- 使用 HTML5 的 IndexedDB API
1. [代码]判断是否支持 IndexedDB var indexedDB = window.indexedDB || window.webkitIndexedDB || window.moz ...
- 分享知识-快乐自己:Oracle SQL语法汇总
--删除重复值-保留重复值最大的编号 delete from emp where rowid in( select rowid from emp where rowid not in( select ...
- IDEA 设置代码行宽度
1.在File->settings->Editor->Code Style 2.在File->settings->Editor->Code Style->XM ...
- CodeForces-329C(div1):Graph Reconstruction(随机&构造)
I have an undirected graph consisting of n nodes, numbered 1 through n. Each node has at most two in ...
- 关于STM32中GPIO的8种工作模式
CSDN:http://blog.csdn.net/l20130316 博客园:http://www.cnblogs.com/luckyalan/ 1 综述 I/O口是单片机中非常常用的外设,STM3 ...