题目保证不存在两个人是同名的。
找最近公共祖先使用向上标记法。
const int N=10010;
unordered_map<string,string> fa;
unordered_map<string,bool> sex;
int n,m;
bool check(string a,string b)
{
unordered_map<string,int> vis;
for(int i=1;a != "";i++)
{
vis[a]=i;
a=fa[a];
}
for(int i=1;b != "";i++)
{
if(vis[b]) return vis[b] >= 5 && i >= 5; // 两人的公共祖先必须比任何一方的曾祖父辈分高
b=fa[b];
}
return true; // vis[b]的值均为0, 说明两人不存在公共祖先,
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
string fname,lname;
cin>>fname>>lname;
if(lname.back() == 'm') sex[fname]=true;
else if(lname.back() == 'f') sex[fname]=false;
else if(lname.substr(lname.size()-4) == "sson")
{
sex[fname]=true;
fa[fname]=lname.substr(0,lname.size()-4);
}
else
{
sex[fname]=false;
fa[fname]=lname.substr(0,lname.size()-7);
}
}
cin>>m;
while(m--)
{
string a,b,c,d;
cin>>a>>b>>c>>d;
if(sex.count(a) == 0 || sex.count(c) == 0)
puts("NA");
else if(sex[a] == sex[c])
puts("Whatever");
else if(check(a,c))
puts("Yes");
else
puts("No");
}
//system("pause");
return 0;
}