【模拟】 hdu4409 Family Name List
2012-09-22 17:32
501 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4409
题意:给你一个家族表,同时有3种操作,问你操作后的结果。
题解:模拟题,把3个操作处理好就行了。题目有个陷阱,比如a是b的父亲,b是c的父亲,当问你b和c的最近的共同父辈是谁的时候,答案是a而不是b。还有问最开头那个祖先的兄弟时要返回1。
代码:
题意:给你一个家族表,同时有3种操作,问你操作后的结果。
题解:模拟题,把3个操作处理好就行了。题目有个陷阱,比如a是b的父亲,b是c的父亲,当问你b和c的最近的共同父辈是谁的时候,答案是a而不是b。还有问最开头那个祖先的兄弟时要返回1。
代码:
#include<cstdio> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<stack> using namespace std; #define M 30005 map<int,string> hasht; map<string,int> hashx; struct cmp//排序 { bool operator()(const int &a, const int &b) { return hasht.find(a)->second<hasht.find(b)->second; } }; struct point { int pre;//父结点的位置 set<int,cmp> son;//子结点的位置 string name;//当前结点的名字 }node[M]; struct px { int idx,len;//结点的位置,结点的辈分 } temp; int cnt; stack<struct px> father; void dfs(int idx,int len)//递归输出族谱 { for(int i=0; i<len; ++i) printf("."); printf("%s\n",node[idx].name.c_str()); for(set<int,cmp>::iterator it=node[idx].son.begin(); it!=node[idx].son.end(); ++it) dfs(*it,len+1); } void out_all()//Print the family list { dfs(0,0); } void out_child()//Print out how many brothers does "name" have, including "name" himself. { char s[70]; scanf("%s",s); if(hashx.count(string(s))==0) { printf("0\n"); return; } if(string(s)==node[0].name) { printf("1\n"); return; } int idx=hashx.find(string(s))->second; printf("%d\n",node[node[idx].pre].son.size()); } void out_pre()//Print out the closest common ancestor of "name1" and "name2". { char a[70],b[70]; scanf("%s%s",a,b); set<int> ax; int ida=hashx.find(string(a))->second; int idb=hashx.find(string(b))->second; for(; ida!=-1;) { ida=node[ida].pre; ax.insert(ida); } for(; idb!=-1;) { idb=node[idb].pre; if(ax.count(idb)!=0) break; } printf("%s\n",node[idb].name.c_str()); } int main() { int n,m,pre; char s[70],c,ord[10]; string sx; for(; scanf("%d",&n),n;) { for(int i=0; i<=n; ++i) { node[i].pre=-1; node[i].son.clear(); } hashx.clear(); hasht.clear(); for(; !father.empty(); father.pop()); cnt=0; temp.idx=0; temp.len=0; scanf("%s",s); sx=string(s); node[cnt++].name=sx; hashx.insert(make_pair(sx,0)); hasht.insert(make_pair(0,sx)); father.push(temp); for(int i=1; i<n; ++i) { for(; getchar()!='.';); int ll=1; for(; (c=getchar())=='.'; ++ll); s[0]=c; int llt; for(llt=1;(s[llt]=getchar())!='\n';++llt); s[llt]='\0'; temp.len=ll; temp.idx=cnt; for(;;) { struct px tx=father.top(); if(tx.len>=temp.len) father.pop(); else break; } sx=string(s); int tx=father.top().idx; node[cnt].pre=tx; node[cnt].name=sx; hasht.insert(make_pair(cnt,sx)); hashx.insert(make_pair(sx,cnt)); node[tx].son.insert(cnt); cnt++; father.push(temp); } scanf("%d",&m); for(; m--;)//处理查询 { scanf("%s",ord); if(ord[0]=='L') out_all(); else if(ord[0]=='b') out_child(); else if(ord[0]=='c') out_pre(); } } return 0; }来源:/article/8559967.html
相关文章推荐
- HDU 4409 - Family Name List(模拟树+lca)
- HDU 4409 Family Name List ( 模拟 + LCA)
- hdu 4409 Family Name List LCA +stl
- hdu 4409 Family Name List
- ACM网络赛金华赛区的一道关于树的题:Family Name List
- HDU 4409 Family Name List --乱搞、LCA
- HDU 4409 Family Name List --乱搞、LCA
- HDU 4409 Family Name List 简单树操作
- hdu 4409 Family Name List 金华赛区1010 (解题报告)
- HDU 4409 Family Name List(LCA)
- HDU-4409 Family Name List LCA求解,TC+DFS || tarjan
- Family Name List (HDU 4409)
- hdu 4409 Family Name List
- Hdu 4409 Family Name List (LCA 家谱 STL 2012金华网赛)
- 【Java学习】使用LinkedList 模拟一个堆栈或者队列数据结构
- first name一般来说是指名字,surname or family name才是姓
- 使用LinkedList模拟一个堆栈或者队列数据结构
- java获取指定路径下的指定文件/java.io.File.listFiles(FilenameFilter filter)
- 2014广州站 E - Song Jiang's rank list(模拟)