利用c STL中的map實現基本雜湊族譜

2021-09-01 12:31:12 字數 1855 閱讀 3417

問題描述(**於以前上過的一門課)

一些家史複雜的家族會記錄家譜。家譜是同乙個姓的族人的乙個集合,從最原始的祖先開始記錄,之後每次新誕生的、與祖先有血緣關係的同姓族人都會被記錄在案。

乙個家庭,我們定義為乙個族人和其直屬同姓子女這兩代人的集合。比如男性族人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 如...