L2-030 冰岛人 (25分)
#include <bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
struct per{
string father;
int sex;
};
unordered_map<string ,per> person;
int judge(string f1,string f2){
int i=1,j;
for(string a=f1;!a.empty();i++,a=person[a].father){
j=1;
for(string b=f2;!b.empty();j++,b=person[b].father){
if(i>=5&&j>=5) return 1;
else if(a==b&&(i<5||j<5)) return 0;
}
}
return 1;
}
void solve() {
int n;
cin>>n;
for (int i = 0; i < n; ++i) {
string f,s;
cin>>f>>s;
int len=s.size();
if(s.back()=='m') person[f].sex=1;
else if(s.back()=='f') person[f].sex=0;
else if(s.back()=='n'){
person[f].sex=1;
person[f].father=s.substr(0,len-4);
}else{
person[f].sex=0;
person[f].father=s.substr(0,len-7);
}
}
int m;
cin>>m;
while (m--){
string f1,f2,s1,s2;
cin>>f1>>s1>>f2>>s2;
if(person.find(f1)==person.end()||person.find(f2)==person.end()){
cout<<"NA";
} else if(person[f1].sex==person[f2].sex){
cout<<"Whatever";
} else cout << (judge(f1, f2) ? "Yes" : "No");
cout<<"\n";
}
}
signed main() {
int _ = 1;
while (_--) {
solve();
}
return 0;
}