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…

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)…

Shell中的特殊字符

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

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

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

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

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

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

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

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…

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

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

树莓派的四种登陆方式

参考&#xff1a;树莓派的4种登陆方式 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:15:30 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113524929?spm1001.2014.3001.5502 目录一、HDMI视频线二、串口1.修改sd卡中的系统文件2…

丰收互联蓝牙key怎么开机_ublox收购Rigado的蓝牙模块业务,扩大蓝牙低功耗产品组合...

全球领先的定位与无线通讯技术供应商u-blox 宣布&#xff0c;已与 Rigado签署资产购买协议&#xff0c;收购其蓝牙模块业务。Rigado是商业物联网Edge-as-a-Service(EaaS)边缘即服务网关解决方案的领先供应商&#xff0c;于2015年开始提供通过认证的无线模块。强化蓝牙产品系列此…

好的编程风格

1。关键字 if, while, for 后有一个空格 2。号之类的双目运算符两侧都有空格 3。后缀运算符和操作数之间不加空格 例如 s.a , foo(argu) , a[i] 4。, 号和 ; 号之后要加空格&#xff0c;例如 foo(argu1, argu2) for (i0; i<20; i) 5。关于双目运算符两侧加空格可以灵活规定&…

android 时间戳 时区,三句话理解时区与时间戳

从不浪费时间的人&#xff0c;没有工夫抱怨时间不够。 —— 杰弗逊第一句话&#xff1a;时间戳时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字&#xff0c;叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、PO…

windows下的diskpart指令彻底格式化清除U盘

参考&#xff1a;windows下的diskpart指令修复U盘分区 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:38:55 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113537038?spm1001.2014.3001.5501 参考&#xff1a;原文链接 作者&…

简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?

作者 | 木小楠链接 |cnblogs.com/liuhaorain/p/3747470.html摘要面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中&#xff0c;OOD有一个重要的思想那就是依赖倒置原则(DIP)&#xff0c;并由此引申出IoC、DI以及Ioc容器等概念。本文我们将一起学习这些概…

html模糊遮罩层磨砂玻璃,常见的PPT背景:如何设计PPT背景?

第一种&#xff1a;纯色背景纯色背景分为两类&#xff0c;一种为黑白灰等“无色”背景&#xff0c;另一种就是彩色背景。黑白灰等无色背景&#xff0c;是安全的背景&#xff0c;容易配色&#xff0c;所以在使用上最多&#xff0c;如果没有色彩基础的朋友&#xff0c;建议还是用…

linux分文件编程、静态库与动态库

参考&#xff1a;linux静态库与动态库编程 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 16:51:49 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113539449?spm1001.2014.3001.5501 目录一、分文件编程的引入优点实现二、库的概念什…

十万个为什么儿童版_《虹猫蓝兔十万个为什么》上架爱奇艺奇巴布绘本馆

虹猫蓝兔绘本《虹猫蓝兔十万个为什么》上架爱奇艺奇巴布绘本馆全套专区。《虹猫蓝兔海底历险记》在爱奇艺PC端首页推广。红网时刻6月11日讯(记者 胡邦建 )今日&#xff0c;记者从湖南漫联卡通文化传媒有限公司获悉&#xff0c;该公司旗下的虹猫蓝兔绘本《虹猫蓝兔十万个为什么》…