思路:就是个比较裸的LCA了,不过要注意的是,如果a和b的公共祖先是a,那么答案就是farther[a]。

#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
#include<iostream>
#include<cstdio>
#define Maxn 300010
using namespace std;
int vi[Maxn],pre[Maxn];
int dep[Maxn],sec[Maxn],farther[Maxn];
int e,Md;
char str[Maxn][],ans[Maxn][];
vector<int> head[Maxn];
map< string,int> g;
void init()
{
Md=;
memset(pre,,sizeof(pre));
memset(vi,,sizeof(vi));
memset(dep,,sizeof(dep));
memset(farther,,sizeof(farther));
memset(sec,,sizeof(sec));
for(int i=;i<=;i++)
head[i].clear();
g.clear();
}
void add(int u,int v)
{
head[u].push_back(v);
}
void dfs(int u)
{
int i,j,now,sz;
sz=head[u].size();
for(i=;i<sz;i++)
{
now=head[u][i];
dep[now]=dep[u]+;
farther[now]=u;
dfs(now);
}
Md=max(Md,dep[u]);
}
void make_sec(int u)
{
int i,j,now,sz;
if(dep[u]<Md)
{
sec[u]=;
}
else
{
if(dep[u]%Md==)
sec[u]=farther[u];
else
sec[u]=sec[farther[u]];
}
sz=head[u].size();
for(i=;i<sz;i++)
{
now=head[u][i];
make_sec(now);
}
}
int LCA(int a,int b)
{
int x=a,y=b;
while(sec[a]!=sec[b])
{
if(dep[a]>dep[b])
a=sec[a];
else
b=sec[b];
}
while(a!=b)
{
if(dep[a]>dep[b])
a=farther[a];
else
b=farther[b];
}
return a;
}
int cmp(int a,int b)
{
return strcmp(ans[a],ans[b])<;
}
void dfssort(int u)
{
int i,v,sz;
sz=head[u].size();
sort(head[u].begin(),head[u].end(),cmp);
for(i=;i<sz;i++)
{
dfssort(head[u][i]);
}
}
void Out(int u)
{
int i,v,sz;
printf("%s\n",str[u]);
sz=head[u].size();
for(i=;i<sz;i++)
{
v=head[u][i];
Out(v);
}
}
int main()
{
int n,i,j,cnt,q;
char cc[];
while(scanf("%d",&n)!=EOF,n)
{
init();
scanf("%s",str[]);
strcpy(ans[],str[]);
g[str[]]=;
pre[]=;
for(i=;i<n;i++)
{
scanf("%s",str[i]);
j=;
cnt=;
while(str[i][j]=='.')
{
cnt++;
j++;
}
int pos=;
while(str[i][j]!='\0')
{
cc[pos++]=str[i][j];
j++;
}
cc[pos]='\0';
g[cc]=i;
strcpy(ans[i],cc);
add(pre[cnt-],i);
pre[cnt]=i;
}
dfssort();
dfs();
Md=sqrt(1.0*Md);
make_sec();
scanf("%d",&q);
for(i=;i<=q;i++)
{
scanf("%s",cc);
if(cc[]=='L')
{
Out();
}
else
if(cc[]=='b')
{
scanf("%s",cc);
int v=g[cc];
printf("%d\n",head[farther[v]].size());
}
else
if(cc[]=='c')
{
char s1[],s2[];
scanf("%s%s",s1,s2);
int u=g[s1];
int v=g[s2];
int ff=LCA(u,v);
if(ff==u)
{
printf("%s\n",ans[farther[u]]);
}
else
if(ff==v)
{
printf("%s\n",ans[farther[v]]);
}
else
printf("%s\n",ans[ff]);
}
}
}
return ;
}

hdu 4409 LCA的更多相关文章

  1. HDU 4409 Family Name List --乱搞、LCA

    题意: 给出一些名字,名字间有父子关系,有三种操作: 1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出 2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1) 3.求节点a和b ...

  2. hdu 4409 Family Name List(LCA&amp;有坑点)

    Family Name List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 3078 (LCA+树链第K大)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...

  4. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  5. [hdu 2586]lca模板题(在线+离线两种版本)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...

  6. hdu 2874(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 思路:近乎纯裸的LCA,只是题目给出的是森林,就要判断是否都在同一颗树上,这里我们只需判断两个子 ...

  7. HDU 2586 ( LCA/tarjan算法模板)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,d ...

  8. hdu 2586(LCA在线ST)

    How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...

  9. HDU 2586 LCA

    题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...

随机推荐

  1. android 工具类之SharePreference

    /** * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 * 同样调用getPara ...

  2. 解析Ceph: Snapshot

    经常有开发者在邮件列表中会问到Ceph Snapshot的实现方式,受限于目前有限的实现文档和复杂的代码结构和代码量,弄清楚Ceph Snapshot并不是一件容易的事.正好最近在重构Ceph存储引擎 ...

  3. JS 执行环境与作用域链

    1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...

  4. 栈的应用-四则表达式(C#代码实现)

    ->概念 中缀表达式 9+(3-1)*3+10/2 转换步骤 9 + 9 + ( 9 3 + ( - 9 3 1 + ( - ) 9 3 1 - + 9 3 1 - + * 9 3 1 - 3 ...

  5. 分布式文件系统HDFS体系

    系列文件列表: http://os.51cto.com/art/201306/399379.htm 1.介绍 hadoop文件系统(HDFS)是一个运行在普通的硬件之上的分布式文件系统,它和现有的分布 ...

  6. JavaWeb-10(会话技术之session&amp;JSP)

    JavaWeb-会话技术之session&JSP 会话管理之Session技术 一.Session 在WEB开发中,server能够为每一个用户浏览器创建一个会话对象(session对象),注 ...

  7. hdu5072 2014 Asia AnShan Regional Contest C Coprime

    最后一次参加亚洲区…… 题意:给出n(3 ≤ n ≤ 105)个数字,每个数ai满足1 ≤ ai ≤ 105,求有多少对(a,b,c)满足[(a, b) = (b, c) = (a, c) = 1] ...

  8. 深入了解android平台的jni(一)

    android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中.     主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的 ...

  9. java.net.SocketException四大异常解决方案【转】

    java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...

  10. valgrind 内存检测与调用图生成

    http://blog.csdn.net/destina/article/details/6198443  感谢作者的分享! 一  valgrind是什么? Valgrind是一套Linux下,开放源 ...