L2-030 冰岛人 (25分) map(蒟蒻版本) 样例3,6

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值