問題描述(**於以前上過的一門課)
一些家史複雜的家族會記錄家譜。家譜是同乙個姓的族人的乙個集合,從最原始的祖先開始記錄,之後每次新誕生的、與祖先有血緣關係的同姓族人都會被記錄在案。
乙個家庭,我們定義為乙個族人和其直屬同姓子女這兩代人的集合。比如男性族人a,生了乙個女兒b,接著生了乙個兒子c,然後生了乙個女兒d。那麼a-bcd可以被稱為乙個以a為祖先的家庭。兩個家庭稱為相似,當且僅當兩個家庭有相同的結構。比如男性族人e,生了乙個女兒f,接著生了乙個兒子g,然後生了乙個女兒h,那麼家庭e-fgh可以和家庭a-bcd稱為相似。但比如男性族人i,生了兩個女兒j、k,再生了乙個兒子l,那麼家庭i-jkl和家庭a-bcd就不能稱為相似。或乙個男性族人m,生了乙個女兒n,接著生了乙個兒子o,那家庭m-no也不能和家庭a-bcd稱為相似。或乙個女性族人p,生了乙個女兒q,接著生了乙個兒子r,然後生了乙個女兒s,那家庭p-qrs也不能和家庭a-bcd稱為相似。如果乙個族人沒有後代,那麼他/她自己乙個人也形成乙個家庭。
乙個子族,我們定義為乙個族人和其所有直屬同姓後代的集合。比如b生了乙個兒子t,c生了兩個女兒u、v,t生了乙個女兒w,那麼a-b=t~w-c=uv-d就可以稱為以a為祖先的子族。同樣子族判斷相似的標準和家庭相同,當且僅當兩個子族擁有相同的結構才能被認為相似。
現在告知乙個家族的家譜,請你回答一些關於相似性的問題。
輸入格式
第一行兩個正整數n、q,表示家譜的長度和詢問的個數。
接下來n行描述家譜,每行的格式為兩個只包含小寫字母的字串parent、child和乙個字元』m』或』f』,表示名為parent的族人生了乙個孩子叫做child,child的性別為』m』(代表男)或』f』(代表女)。家譜的描述以日期順序,即同一家庭中,先描述的是哥哥/姐姐,後描述的是弟弟/妹妹。
接下來是q行詢問,每行有可能是:
1.乙個字元』f』和乙個字串parent,表示詢問有多少家庭和以parent為祖先的家庭相似(不包括parent自身)。
2.乙個字元』s』和乙個字串parent,表示詢問有多少子族和以parent為祖先的子族相似(不包含parent自身)。
最原始的祖先名字為字串』root』,性別為男性。
族人的名字兩兩不同。
資料保證合法性,且資料預設沒有族人之間結婚的情況。
輸出格式
對於每個詢問輸出一行乙個整數表示答案。
#include
#include
#include
#include
using namespace std;
const
int q1 =
999999937
;const
int q2 =
999992221
;int a =
2, b =3;
void
generate
(mapint>
&t, string parent, string child,
char gender)
void
family
(mapint>
t, map<
int,
int>
&r)}int
main
(int argc,
const
char
* argv)
family
(tree, result)
;for
(int i =
0; i < q; i++)if
(order ==
"q")
}}
目前只解決了f類的詢問,往後嘗試解決q類的詢問。 c stl中map容器的基本用法
std map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能 力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下std map內部資料的組織,std map內部自建一...
C STL中Map的按Value排序
那麼我們如何實現對pair按value進行比較呢?第一種 是最原始的方法,寫乙個比較函式 第二種 剛才用到了,寫乙個函式物件。這兩種方式實現起來都比較簡單。typedef pairint pair bool cmp by value const pair lhs,const pair rhs str...
c STL容器中map和hash map
map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。自動建立key value的對應。key 和 value可以是任意你需要的型別。根據key值快速查詢記錄,查詢的複雜度基本是log n 如...