#include <cstdio>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
map<string,int> ma;
string sttr[200006];
vector<int> vec[200005];
vector<int> mat[200005];
vector<int> all[200005];
map<int,pair<int,int> > ans;
int vis[200005];
int cnt = 1;
int n,m;
int fa[200005];
int find(int x){
return x == fa[x] ? x: fa[x] = find(fa[x]);
}
string solve(int a,int b){
int si = all[a].size();
for(int i = 0;i < si;i++){
if(mat[a][i] == b && all[a][i]){
return sttr[all[a][i]];
}
}
si = all[b].size();
for(int i = 0;i < si;i++){
if(mat[b][i] == a && all[b][i]){
return sttr[all[b][i]];
}
}
}
void dfs(int u){
vis[u] = 1;
int si = vec[u].size();
for(int i = 0;i < si;i++){
int v = vec[u][i];
if(!vis[v]){
dfs(v);
}
fa[v] = u;
}
vis[u] = 2;
si = all[u].size();
for(int i = 0;i < si;i++){
int v = mat[u][i];
if(vis[v] == 2)
all[u][i] = find(v);
}
}
int main(){
cin >> n;
for(int i = 0;i < n;i++){
string a,b;
cin >> a >> b;
if(ma[a] == 0){
sttr[cnt] = a;
ma[a] = cnt++;
}
if(ma[b] == 0){
sttr[cnt] = b;
ma[b] = cnt++;
}
int x,y;
x = ma[a];
y = ma[b];
vec[x].push_back(y);
}
cin >> m;
for(int i = 1;i <= m;i++){
string a,b;
cin >> a >> b;
int x,y;
x = ma[a];
y = ma[b];
mat[x].push_back(y);
all[x].push_back(0);
mat[y].push_back(x);
all[y].push_back(0);
ans[i] = make_pair(x,y);
}
for(int i = 1;i <= cnt;i++){
fa[i] = i;
}
dfs(1);
for(int i = 1;i <= m;i++){
cout << solve(ans[i].first,ans[i].second) << endl;
}
return 0;
}
hihocoder1067 离线LCA
最新推荐文章于 2021-03-30 16:21:47 发布