L2-030 冰島人

YuKiCheng發表於2024-03-20

費解啊。
"所謂“五代以內無公共祖先”是指兩人的公共祖先(如果存在的話)必須比任何一方的曾祖父輩分高。"
也就是這個祖先出現在任意一方的五代中,都認為是近親。
只有他是A的五代之外並且是B的五代之外,才認為不是近親。

#include <bits/stdc++.h>
using namespace std;
map<string, pair<int, string>> mp;
bool check(string a,string b) {
	map<string, int> ss;//名字,第幾代
	int count = 1;
	while (a.size()) {
		ss[a] = count;
		a = mp[a].second;
		count++;
	}
	int count2 = 1;
	while (b.size()) {
		if (ss.count(b)) {//如果在a中找到了b
			if (ss[b] < 5 || count2 < 5) return false;//只要在一方當中屬於近親那麼就是近親
			else return true;//不是近親
		}
		b = mp[b].second;
		count2++;
	}
	return true;//不是近親
}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string sname, fname;
		cin >> sname >> fname;
		int len = fname.size();
		if (fname[len - 1] == 'm') {
			mp[sname].first = 1;//男孩
		}
		else if (fname[len - 1] == 'f') {
			mp[sname].first = -1;//女孩
		}
		else {
			int pos = fname.find("sson");
			if (pos != -1) {
				string s = fname.substr(0, pos);
				mp[sname] = { 1,s };//男孩
			}
			pos = fname.find("sdottir");
			if (pos != -1) {
				string s = fname.substr(0, pos);
				mp[sname] = { -1,s };//女孩
			}
		}
	}
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		string a, b, c, d;
		cin >> a >> b >> c >> d;//a和c是有用的
		if (mp.count(a) && mp.count(c)) {
			int sex1 = mp[a].first;
			int sex2 = mp[c].first;
			if (sex1 == sex2) {
				cout << "Whatever" << '\n';
				continue;
			}
		}
		if (!mp.count(a) || !mp.count(c)) {
			cout << "NA" << '\n';
			continue;
		}
		int isok = check(a, c);
		if (isok) cout << "Yes" << '\n';
		else cout << "No" << '\n';
	}
	return 0;
}

參考部落格: https://blog.csdn.net/hys__handsome/article/details/124484080

相關文章