問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
ハッシュ関数は様々なデータの要約・検証に使うことができます。そのうちのひとつがマークル木(マークルツリー)です。マークル木とは、ノードにハッシュ値をもつ二分木で、それぞれ親ノードには子ノードのハッシュ値を結合したものを入力として得られるハッシュ値が割り当てられています。特に、木構造の根の部分のハッシュ値をルートハッシュと呼びます。以下の例を参考にしてください。
本問では、マークル木におけるデータの検証をおこなってみましょう。
整数 N とルートハッシュ h が与えられます。その後、木構造の位置を表す b_i (1 ≦ i ≦ N) とその位置 b_i のハッシュ値 hb_i が与えられます。最後に、 b_{N+1} とその位置のデータ d が与えられます。データ d はハッシュ値ではないことに注意してください。以下のハッシュ関数 H を用いて、データ d とハッシュ値 hb_i から得られるルートハッシュ h' を求め、h' が初めに与えられたルートハッシュ h と一致するならば Yes
、そうでないならば No
と出力してください。なお、親ノードのハッシュ値 hb を計算する際は、上の画像のように、隣同士の子ノードのハッシュ値 hb0 と hb1 を順番に文字列として結合させて得た新たな文字列を入力として計算してください。
文字列 s の長さを m として、
H(s) = (s の 1 文字目の文字コード * B1 + s の 2 文字目の文字コード * B2 + ... + s の m 文字目の文字コード * Bm) % mod
N
h
b_1 hb_1
b_2 hb_2
...
b_N hb_N
b_{N+1} d
h' が h と一致するならば Yes
、そうでないならば No
と一行で出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
2
796394619
1 724134430
01 988302243
00 apple
Yes
2
111111111
0 541278416
11 459428080
10 chocolate
No
10
143632914
0 723005018
11 419474906
100 539509504
1010 831802410
10110 77116613
101111 854499537
1011100 17807669
10111011 309861176
101110101 504344288
1011101000 238555247
1011101001 paiza
Yes