4292:木をカウント(树ハッシュ)

4292:木を数えます 共有へのQQスペース

制限時間(通常/ジャワ):2000ミリ秒/ 6000MSメモリ制限:65536KByte
総提出: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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/12078371.html