4292:木を数えます
総提出:15テストに合格:6
説明
バイナリツリーは、各ノードは、通常、「左」および「右」として区別高々2つのつの子ノードを有する、ツリーデータ構造です。木Tの部分木は、その左の部分木が同じであれば同じと呼ばれるTおよびT.二バイナリツリーにおけるその子孫のすべてのノードからなるツリー(または両方を有する無左サブツリー)であり、その右サブツリーであります同じ(または両方の権利サブツリーを有していません)。
最近の研究によると、世界で何人かの人々は、与えられた木から、各それぞれ、同一の部分木のペアの数を数えることに興味があります。
さて、あなたは、2つのツリーを与えられています。最初のものは最初の木から来て2つ目は、第二の木から来ているように、同じサブツリーのペアの数をカウントするために役立つプログラムを書きます。
エントリー
複数のテストケースがあります。最初の行は、正の整数含ま T (T テストケースの数を示す≤20)。そして、 Tの テストケースが続きます。
各テストケースでは、二つの整数であり 、N と M (1≤ N、M 、所与の2つのツリー内のノードの数を示す≤100000)。次の n個の 行が最初のツリーを記述する。 I番目の行は、二つの整数含ま U 及び V (1≤ U ≤ N または U = -1、1つの≤ V ≤ N 又は V = -1)ノードの左及び右の子のインデックスを示す Iを。場合 のu や vが -1に等しく、それは、そのノードを意味し 、私を 対応する左または右の子を持っていません。その後に続いて 、m個の 同一のフォーマットで第二のツリーを記述する行。両方のツリーの根ノード1です。
輸出
各テストケースのために、結果を含む行を印刷します。
サンプル入力
2
2 2
-1 2
-1 -1
2 -1
-1 -1
5
2 3
4 5
-1 -1
-1 -1
-1 -1
1 2 3
4 5
-1 -1
-1 -1
-1 - 1
サンプル出力
1
11
プロンプト
このような最初のサンプルを見に2本の木。
問題解決のアイデア:子供連れに与えるツリーは、ハッシュツリーの合計数に等しいです
1の#include <ビット/ STDC ++ H> 2 の#define長い長llの 3 使用して 名前空間STDを、 4 5 int型のT。 6 INT N、M、jishu、フラグ。 7 CONST INT MAXN = 1E5 + 5 。 8 INTツリー[MAXN] [ 2 ]。 9 INT NUM [MAXN]。 10地図<ペア< 整数、整数 >、INT > MA。 11の LL RES。 12の 13 INTの DFS(int型EE){ 14 INT LS = - 1、RS = - 1 、T。 15 であれば(ツリー[EE] [ 0 ] =! - 1)LS = DFS(ツリー[EE] [ 0 ])。 16 であれば(ツリー[EE] [ 1 ] = - !1)RS = DFS(ツリー[EE] [ 1 ])。 17 であれば(!{フラグ) 18 であれば(ma.count({LS、RS})!)MA [{LS、RS}] = ++ jishu。 // ハッシュ 19 NUM [T = MA [{LS、RS}]] ++; // 计数 20 } 21 他{ 22 であれば()RES + = NUM [T = ma.count({LS、RS)}MA [{LS、RS}]]。 23 他の T = 0 ; 24 } 25 リターンT。 26 } 27 28 、INT (){主 29 のscanf(" %dの"、&T)。 30 一方(t-- ){ 31 ma.clear()。 32 のmemset(NUM、0、はsizeof (NUM))。 33 のscanf(" %D%D "、&N、&M)。 34 のために(INT I = 1; I <= N; I ++ ){ 35 のscanf(" %D%D "、&ツリー[I] [ 0 ]、&ツリー[I] [ 1 ])。 36 } 37 フラグ= 0、jishu = 0 。 38の DFS(1 )。 39 のために(INT iは= 1 ; iが<= M; I ++ ){ 40 のscanf(" %D%D "、&ツリー[I] [ 0 ]、&ツリー[I] [ 1 ])。 41 } 42の RES = 0フラグ= 1、DFS(1 )。 43 のprintf(" %のLLD \ n " 、RES)。 44 } 45 リターン 0 。 46 }