L2 030 冰島人 25分

2021-10-10 08:46:41 字數 2439 閱讀 3346

2023年世界盃,冰島隊因1:1平了強大的阿根廷隊而一戰成名。好事者發現冰島人的名字後面似乎都有個「松」(son),於是有網友科普如下:

輸入首先在第一行給出乙個正整數 n(1隨後一行給出正整數 m,為查詢數量。隨後 m 行,每行給出一對人名,格式為:名1 姓1 名2 姓2。注意:這裡的姓是不帶字尾的。四個字串均由不超過 20 個小寫的英文本母組成。

題目保證不存在兩個人是同名的。

對每乙個查詢,根據結果在一行內顯示以下資訊:

若兩人為異性,且五代以內無公共祖先,則輸出 yes;

若兩人為異性,但五代以內(不包括第五代)有公共祖先,則輸出 no;

若兩人為同性,則輸出 whatever;

若有一人不在名單內,則輸出 na。

所謂「五代以內無公共祖先」是指兩人的公共祖先(如果存在的話)必須比任何一方的曾祖父輩分高。

15chris smithm

adam smithm

bob adamsson

jack chrissson

bill chrissson

mike jacksson

steve billsson

tim mikesson

april mikesdottir

eric stevesson

tracy timsdottir

james ericsson

patrick jacksson

robin patricksson

will robinsson

6tracy tim james eric

will robin tracy tim

april mike steve bill

bob adam eric steve

tracy tim tracy tim

x man april mikes

yesno

nowhatever

whatever

na作者

陳越單位

浙江大學

**長度限制

16 kb

時間限制

400 ms

記憶體限制

64 mb

c++ (clang++ 6.0.1)

雖然**長了點,但是時間複雜度okk的呀~

首先姓氏沒有用的,然後題目中最後一句話----所謂「五代以內無公共祖先」是指兩人的公共祖先(如果存在的話)必須比任何一方的曾祖父輩分高。

就是兩個人的祖先相同,只要乙個人的父輩在5代以內就不行。所以用了兩遍dfs的過程來判斷

#include

using

namespace std;

mapint> mp;

struct nodere[

100010];

vector<

int> ma[

100010];

bool vis[

100010];

void

dfs(

int st,

int k)

}bool judge =

true

;void

dfs2

(int st,

int k)

}int

main()

for(

int i=

1;i<=n;i++

)else

else

if(k.

substr

(k.size()

-7,7

)=="sdottir")}

}int k;

cin>>k;

while

(k--)}

}

在處理資料輸入的時候,不能用數字id去對每乙個名字標號,就是會出現父親節點在兒子節點之後出現的情況,所以不能直接用mp【parent】 去做!!

這樣mp[parent] 就可能會是0,出錯啦就

#include

using

namespace std;

struct nodere[

100010];

mapint> mp;

bool

judge

(string a,string b)

}return1;

}int

main()

;//就是會出現父親節點在兒子節點之後出現的情況,所以不能直接用mp【parent】 去做!!

else

if(b.

back()

=='r'

) re[i]=;

else re[i]

.***=b.

back()

;}cin>>k;

while

(k--

)return0;

}

L2 030 冰島人 25分

輸入格式 輸入首先在第一行給出乙個正整數 n 1隨後一行給出正整數 m,為查詢數量。隨後 m 行,每行給出一對人名,格式為 名1 姓1 名2 姓2。注意 這裡的姓是不帶字尾的。四個字串均由不超過 20 個小寫的英文本母組成。題目保證不存在兩個人是同名的。輸出格式 對每乙個查詢,根據結果在一行內顯示以...

天梯賽 L2 030 冰島人

題意 給你n個人的姓名,他們組成了若干個家族,再給出m個詢問,每次詢問給出兩個人的姓名,問他們能否交往,只要最近公共祖先必須與任何乙個人相隔超過5代才能交往。思路 對每個人的名字進行編號,然後把字尾給去掉,根據名和姓建立若干棵家族樹,再用乙個節點把這若干棵樹給連成一顆樹,找最近公共祖先,特判一下0號...

L2 2 冰島人 (25 分

2018年世界盃,冰島隊因1 1平了強大的阿根廷隊而一戰成名。好事者發現冰島人的名字後面似乎都有個 松 son 於是有科普如下 輸入首先在第一行給出乙個正整數 n 1隨後一行給出正整數 m,為查詢數量。隨後 m 行,每行給出一對人名,格式為 名1 姓1 名2 姓2。注意 這裡的姓是不帶字尾的。四個字...