最近公共祖先·一
AC代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main()
{
int N,M,id=0;
scanf("%d",&N);
vector<string> fa,son,names;
map<string,int> m;
for(int i = 0; i < N; i++) {
string str1,str2;//str1父亲,str2孩子
cin>>str1>>str2;
fa.push_back(str1);
son.push_back(str2);
m[str1] = 0;m[str2] = 0;
}
for(map<string,int>::iterator it = m.begin(); it != m.end(); it++){
names.push_back(it->first);
it->second = id++;
}
vector<int> pa(id,-1);
for(int i = 0; i < N; i++)
pa[m[son[i]]] = m[fa[i]];
scanf("%d",&M);
for(int i = 0; i < M; i++){
string str1,str2;
cin>>str1>>str2;
int a = -1,b = -1;
if(m.count(str1))
a = m[str1];
if(m.count(str2))
b = m[str2];
if(a==-1 || b==-1){
if(str1 == str2)
cout<<str1<<endl;
else
printf("-1\n");
}
else{
vector<int> mask(id,1);
while(a>-1) {mask[a] = 0;a = pa[a];}
while(b>-1 && mask[b]) b = pa[b];
if(b>-1)
//printf("%s\n",names[b].c_str());
cout<<names[b]<<endl;
else
printf("-1\n");
}
}
return 0;
}