hihocoder #1067 LCA
2015-11-01 13:03
393 查看
裸LCA,练模板
#include<iostream> #include<map> #include <string.h> #include<algorithm> #include<fstream> #include<cmath> #include<vector> #include<queue> #include<map> using namespace std; #define lch(i) ((i)<<1) #define rch(i) ((i)<<1|1) #define sqr(i) ((i)*(i)) #define pii pair<int,int> #define mp make_pair #define FOR(i,b,e) for(int i=b;i<=e;i++) #define FORE(i,b,e) for(int i=b;i>=e;i--) #define ms(a) memset(a,0,sizeof(a)) const int maxnum =100005; const int mod = 1000000007; int n,m,len,deepest; char* ans[maxnum]; struct node { char* name; bool visit; node* anc; vector<node*> son; vector<pair<node*,int>> query; node(): name(NULL), anc(NULL), son(), visit(0), query(){} node(char *str): anc(NULL), son(), visit(0), query(){ name = new char[strlen(str)]; strcpy(name,str); } node(string str){ node(str.c_str()); } ~node(){ if(name) delete[] name; } }; node* root; map<string,node*> name2node; node* findanc(node* rt){ if(rt->anc!=rt){ findanc(rt->anc); rt->anc = rt->anc->anc; } return rt->anc; } void dfs(node* rt){ rt->anc=rt; int si = rt->son.size(); FOR(i,0,si-1){ dfs(rt->son[i]); rt->son[i]->anc=rt; } rt->visit=1; si= rt->query.size(); FOR(i,0,si-1){ if(rt->query[i].first->visit){ ans[rt->query[i].second]=findanc(rt->query[i].first)->name; } } } int main() { /*fstream fin("G:/1.txt"); fin>>n;*/ cin>>n; char name[1000]; root=0; node *far,*son; FOR(i,1,n){ scanf("%s",name); /*fin>>name;*/ if(name2node[name]==0){ far = new node(name); name2node[name]=far; } else far = name2node[name]; if(i==1) root = far; scanf("%s",name); /*fin>>name;*/ if(name2node[name]==0){ son = new node(name); name2node[name]=son; }else far = name2node[name]; far->son.push_back(son); } cin>>m; /*fin>>m;*/ FOR(i,1,m){ scanf("%s",name); /*fin>>name;*/ far = name2node[name]; scanf("%s",name); /*fin>>name;*/ son = name2node[name]; far->query.push_back(mp(son,i)); son->query.push_back(mp(far,i)); } dfs(root); FOR(i,1,m){ printf("%s\n",ans[i]); } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- LCA模板
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪