L2-030 冰岛人 (25分) map
题目大意就不讲了,主要关注最后一句话
所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何
一方的曾祖父辈分高。
这句话的意思就是两个人如果存在共同的祖先的话,任意一个人的祖先在他那
的辈分要比曾祖父高。
例如:A与B有共同的祖先C,C是A的祖父,C是B的曾曾祖父。(通俗的说就
是C繁衍到A没有超过5代,C繁衍到B超过了5代)这种情况是不行的!
这也是样例3,6错误的原因!!!
此题运用类似并查集的思想,不断寻找他的祖先来进行判断。se表示的是名字—父辈名字 。sex则是 名字—性别。(可以使用结构体)
solvename函数处理的是他的性别和父辈名字;
两个vector分别存两个人的家族,用来进行判断。
**代码中有很多可以简化的地方 懒得改了 这代码是写的真难看oVo **
我觉的主要坑点还是样例3,6 !!
//注意数据大小!!!懂?!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string solvename(string s,int *n){
string ans="";
int length=s.length();
if(s[length-1]=='m'){
*n=0;
for(int i=0;i<length-1;i++) ans+=s[i];
}
else if(s[length-1]=='f') {
*n=5;
for(int i=0;i<length-1;i++) ans+=s[i];
}
else if(s[length-1]=='n'){
*n=1;
for(int i=0;i<length-4;i++) ans+=s[i];
}
else if(s[length-1]=='r'){
*n=2;
for(int i=0;i<length-7;i++) ans+=s[i];
}
return ans;
}
map<string,string> se;
string find(string s){
if(s==se[s]){
return s;
}
else return se[s];
}
int main() {
ios::sync_with_stdio(false);
map<string,int> sex;//1 wei nan 2 wei nu
int t;
cin>>t;
while(t--){
string s1,s2;
cin>>s1>>s2;
int n;
string name;
name=solvename(s2,&n);
if(n==0){
se[s1]=s1;
sex[s1]=1;
}
else if(n==5){
sex[s1]=2;
se[s1]=s1;
}
else{
se[s1]=name;
sex[s1]=n;
}
}
int m;
cin>>m;
while(m--){
string s1,sn1,s2,sn2;
cin>>s1>>sn1>>s2>>sn2;
if(se[s1]==""||se[s2]==""){
cout<<"NA"<<endl;
continue;
}
if(sex[s1]==sex[s2]){
cout<<"Whatever"<<endl;
}
else{
int flag=0;
vector<string> v1;
vector<string> v2;
string ss1,ss2;
ss1=find(s1);
v1.push_back(s1);
while(s1!=ss1){
v1.push_back(ss1);
s1=ss1;
ss1=find(s1);
}
ss2=find(s2);
v2.push_back(s2);
while(s2!=ss2){
v2.push_back(ss2);
s2=ss2;
ss2=find(s2);
}
for(int i=0;i<v1.size()&&i<=3;i++){
for (int j = 0; j < v2.size(); ++j) {
if(v1[i]==v2[j]){
flag=1;
break;
}
}
}
for(int i=0;i<v2.size()&&i<=3;i++){
for (int j = 0; j < v1.size(); ++j) {
if(v2[i]==v1[j]){
flag=1;
break;
}
}
}
if(flag==1) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
return 0;
}