hdu 4409 Family Name List LCA +stl

http://acm.hdu.edu.cn/showproblem.php?pid=4409

赛后才过只能说悲剧了,知道思路,stl不熟悉,所以导致写的很慢....占据了很多时间,手速+代码准确度。。哎。。。

题意:

给你一个家谱,n个人的姓名,姓名前边的点代表了他是第几代人。每个人的祖先肯定在他之前出现。有三种操作:

L:输出这个家族的序列,不是按层数,而是递归的输出,还要保证字典序升序;

b name 输出name的兄弟个数,注意这里堂兄弟不算:

c name1 name2 求name1 name2的最近公共祖先。

思路:

首先我用set建图这样就能保证L输出时按字典序输出,mp用来进行映射,rmq+lca求最近公共祖先,这里注意的是如果x,y的lca等于x或者y就要输出lca的父亲才是他们的LCA。还有如果访问Mr.X的兄弟的话要输出1.

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <string>#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))#define Max(a , b) ((a) > (b) ? (a) : (b))#define ll __int64
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 100007
#define N 30007
using namespace std;
//freopen("din.txt","r",stdin);

map<string,int>mp;
set<string>st[N];int pos[N];//点为i的编号
int bro[N];//记录i的兄弟数int E[N << 1],D[N << 1],R[N],dp[N << 1][30];//rmq+lcachar strT[N][66];
int pow2[32],pa[N];//记录i点的父节点
int n,top;void dfs(int u,int h){E[++top] = u;D[top] = h;R[u] = top;set<string>::iterator it;for(it = st[u].begin(); it != st[u].end(); ++it){int v = mp[*it];dfs(v , h+1);E[++top] = u;D[top] = h;}return;
}
int Min(int i,int j){if (D[i] < D[j]) return i;else return j;
}//rmq的初始化
void init_rmq()
{for (int i = 0; i < 30; ++i) pow2[i] = 1<<i;for(int i = 1;i <= top; ++i){dp[i][0] = i;}for(int j = 1; pow2[j] <= top; ++j){for(int i = 1; (i + pow2[j] - 1) <= top; ++i){dp[i][j] = Min(dp[i][j-1],dp[i + (1 << (j-1))][j-1]);}}return;
}int rmq(int l,int r){int d = log((double)(r - l + 1)) / log(2.0);return Min(dp[l][d],dp[r - pow2[d] + 1][d]);
}
//L顺序输出,这里set直接排序了
void dfspath(int u){set<string>::iterator it;for (it = st[u].begin(); it != st[u].end(); it++){int v = mp[*it];printf("%s\n",strT[v]);dfspath(v);}
}
int main(){// freopen("din.txt","r",stdin);int i,j;while (~scanf("%d",&n)){if (!n) break;CL(pos,0); mp.clear();for (i = 0; i <= n; ++i) st[i].clear();for (i = 0; i < n; ++i){scanf("%s",strT[i]);//找点的个数int tmpnum = 0;int sz = strlen(strT[i]);for (j = 0; j < sz; ++j){if (strT[i][j] == '.') tmpnum++;else break;}//点为tmpnum的编号pos[tmpnum] = i;string s;for (; j < sz; ++j){s.push_back(strT[i][j]);}//cout<<strT[i]<<"*********"<<s<<endl;mp[s] = i;//建立映射关系if (tmpnum != 0){st[pos[tmpnum - 1]].insert(s);pa[i] = pos[tmpnum - 1];//记录该节点的父亲节点
            }}CL(bro,0);set<string>::iterator it;for (i = 0; i < n; ++i){//printf("%d %s>>\n",i,strT[i]);int sz = st[i].size();for (it = st[i].begin(); it != st[i].end(); ++it){int tmp = mp[*it];//cout<<tmp<<endl;bro[tmp] = sz;//统计兄弟数量
           }}bro[0] = 1;//这里很容易错,注意要初始化//for (i = 1; i < n; ++i) printf(">>%d %d\n",i,bro[i]);//lca+rmq的过程top = 0;dfs(0,0);init_rmq();char op[3];int q;scanf("%d",&q);while (q--){scanf("%s",op);string tmps;if (op[0] == 'L'){printf("%s\n",strT[0]);dfspath(0);}else if (op[0] == 'b'){cin>>tmps;int posn = mp[tmps];printf("%d\n",bro[posn]);}else{string s1,s2;int lca;cin>>s1>>s2;int x = mp[s1];int y = mp[s2];if (R[x] <= R[y]) lca = E[rmq(R[x],R[y])];else lca = E[rmq(R[y],R[x])];if (lca == x || lca == y) lca = pa[lca];//注意这里的处理int t;int L = strlen(strT[lca]);for (t = 0; t < L; ++t){if (strT[lca][t] != '.') printf("%c",strT[lca][t]);}printf("\n");}}}return 0;
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql杂记

1、 mysql安装完成后需要将mysql里面的bin目录加到环境变量里之后&#xff0c;才能在cmd窗口里使用mysql命令 2、 在CMD命令窗口敲入命令 mysql -hlocalhost -uroot -ppassword进入mysql数据库 这里我的用户名是root&#xff0c;密码是123456 转载于:https://www.cnblogs.com/y…

android包名更换后升级方案,Android增量升级方案

背景随着业务的发展&#xff0c;安装包的体积也在不断的增大&#xff0c;这时候&#xff0c;如果要版本更新&#xff0c;用户不得不去下载完整的安装包。但是如果使用增量升级方案&#xff0c;用户只需要下载新旧版本的差异包&#xff0c;然后在本地合成就行&#xff0c;这样省…

Linux 学习 Ubuntu 12.04 配置指南

关于Ubuntu 就不在此详细的叙述&#xff0c; 安装方法&#xff1a; 硬盘安装&#xff0c;速度效果都还不错 http://www.nenew.net/ubuntu-12-04-hard-disk-install-tutorial.html 详细的方法可以去这里看一下 U盘安装&#xff1a;这个就更加的简单&#xff0c;我一般都是使用 U…

vue created 生命周期

在实例创建完成后被立即调用。在这一步&#xff0c;实例已完成以下的配置&#xff1a;数据观测 (data observer)&#xff0c;属性和方法的运算&#xff0c;watch/event 事件回调。然而&#xff0c;挂载阶段还没开始&#xff0c;$el属性目前不可见。 methods、data、watch等可以…

android cne服务,Android内存优化-了解内存篇

查看系统内存文件shellaries:/ $ cat /proc/meminfoMemTotal: 1970216 kBMemFree: 83756 kBBuffers: 156020 kBCached: 702516 kBSwapCached: 0 kBActive: 1160284 kBInactive: 397932 kBActive(anon): 778932 kBInactive(anon): 2228 kBActive(file): 381352 kBInactive(file)…

《鸟哥的linux私房菜-服务器篇 第三版》 RHCA亲授

经典再现&#xff0c;《鸟哥的linux私房菜-服务 器篇&#xff08;第三版&#xff09;》远程班隆重推出&#xff01; 鸟哥的linux的私房菜是linux教材中的 经典中的经典&#xff01;是学习linux的绝佳资 料&#xff01; 上课时间&#xff1a; 周一到周五 上课方式&#xff1a;全…

装饰者模式

装饰者模式的实现有两个要求&#xff1a;1.装饰者类与目标类要实现相同的借口&#xff0c;或者继承自相同的抽象类。2.装饰者类中要有目标类的引用作为成员变量&#xff0c;具体的赋值一般通过带参构造器完成。 按着这两个要求我们进行类的编写。 目标类&#xff1a; //接口 pa…

子弹类

import pygame # pygame2d游戏 import time from pygame.locals import *class HeroPlane(object):def __init__(self,screen_temp):self.x210self.y700self.screenscreen_tempself.image pygame.image.load("./feiji/hero1.png")self.bullet_list[]def display(sel…

Shell中的特殊字符

通配符 当需要用命令处理一组文件&#xff0c;例如file1.txt、file2.txt、file3.txt……&#xff0c;用 户不必一一输入文件名&#xff0c;可以使用Shell通配符。Shell命令的通配符含义如下表 引号 在 Shell 中引号分为 2 种&#xff1a;单引号、双引号。 &#xff08; 1 &…

树莓派换源、vim更新:树莓派更换国内可用镜像源

参考&#xff1a;树莓派vim更新&#xff1a;树莓派更换国内可用镜像源 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-01 22:40:48 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113530423?spm1001.2014.3001.5502 Ubuntu18.04换源更新…

android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果

帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧)&#xff0c;所有每个子组件占据一帧&#xff0c;这些帧都会根据gravity属性执行自动对齐。FrameLayout的常用XML属性和相关方法XML属性相关方法说  明android:foregroundsetForeground(Drawable)设置该帧布局容器…

flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...

时代在变化&#xff0c;科技在进步&#xff0c;曾几何时我们一度以为的高科技&#xff0c;在现在看来也不过是平常到不能再平常的东西。游戏开发也一样&#xff0c;以前需要代码才能开发制作而成&#xff0c;现如今都不需要了&#xff0c;直接编辑就OK&#xff0c;Steam商城这次…

Flask之flask-session

简介 flask-session是flask框架的session组件&#xff0c;由于原来flask内置session使用签名cookie保存&#xff0c;该组件则将支持session保存到多个地方&#xff0c;如&#xff1a; redis&#xff1a;保存数据的一种工具&#xff0c;五大类型。非关系型数据库memcachedfilesy…

快速构建Windows 8风格应用10-设备方向

本篇博文主要介绍常用支持Windows 8操作系统设备的方向、如何获取当前设备方向、DisplayProperties类 常用支持Windows 8操作系统设备的方向在我们常用的设备当中&#xff0c;Windows 8是通过什么来监控设备方向呢&#xff1f;答案是方向传感器&#xff0c;那么对于设备的不同方…

android viewpager fragment传值,Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题...

前言之前在做一个Viewpager上面加载多个Fragment时总会实例化已经创建好的Fragmnet对象类似viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {Overridepublic Fragment getItem(int position) {switch(position){case 0:fragmentsnew Fragmnet01(…

CSDN怎么转载别人的博客

参考&#xff1a;CSDN怎么转载别人的博客 作者&#xff1a;zhongjianblackberry 发布时间&#xff1a;2018-03-06 11:57:59 网址&#xff1a;https://blog.csdn.net/zhongjianblackberry/article/details/79456338 目录转载CSDN博客步骤&#xff1a;Markdown和HTML相关小知识Ma…

青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...

来源&#xff1a;环球网为推进城市治理数字化程度&#xff0c;提升城市治理的智能化和精细化水平&#xff0c;青岛西海岸新区搭建了人工智能搜索视觉分析平台&#xff0c;以月度更新的频率&#xff0c;汇聚了新区0.5米高分辨率卫星影像数据&#xff0c;通过数据资源共享系统为各…

总结jenkins Android自动打包遇到的坑

一、ndk-build报错 [roothejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: /usr/local/android-ndk-r8/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 解决方法&#xff1a;安装glibc.i6…

微博VS微信,谁更有移动优势

微博、微信&#xff0c;一个是中国互联网的明星&#xff0c;一个是中国互联网的后起之秀&#xff0c;前者出身于中国最大的门户网站新浪&#xff0c;后者出身于中国最大的即时通讯公司腾讯。作为各自公司在移动互联网上的主推产品&#xff0c;两者都背负着公司的巨大期望。那么…

android的热修复,Android热修复原理

热修复框架技术主要有三类&#xff0c;代码修复&#xff0c;资源修复&#xff0c;动态链接库修复。资源修复很多资源修复的框架参考了Instant Run资源修复的原理&#xff0c;所以先了解一下Instant RunInstant RunInstant Run是Android Studio 2.0以后新增的一个运行机制&#…