ABC242D ABC Transform
解説AC
テキストとyoutubeの解説の自分用まとめです。特に新しいことはありません。公式を見た方が詳細です。
二分木として考える
各文字が2つの文字になることを順に図示すると、二分木の構成になります。
よって、この問題は、
を根とする二分木における、深さで番目の文字を求めよ
という問題と見ることができます。
における0,1,2をA,B,Cに対応させます。
Aの左子ノードがB、右子ノードがCであるとします。
左子ノードに進むことは、において+1すること、右子ノードに降りることは+2することと同じです。B,Cにおいても同様に考えることができます。
よって、親の文字がわかれば子の文字を求めることができます。
以降、+xするという表現は上での操作を指します。
親と子の番号の関係
深さにおいて、番目である場合、その子は、深さにおいて、左子ノードが番目、右子ノードがとなります。
以下が理由です。
深さにおいて番目である場合、自分より前にはまでの個のノードが存在する。
深さには、それらの子ノードが2個ずつ存在し、その数は個となる。それらの番号は、となるから。
これより、
- 親が番目なら、子の番号は左が、右が
- 子の番号がなら親の番号は、
が言えます。
また、
- 子の番号が偶数なら親の左子ノード、奇数なら右子ノード
も言えます。
が小さい場合
解説にならって、の番目の文字を求める関数をとおきます。
以下のように再帰的に求められます。
を求め、が偶数なら+1、奇数なら+2します。
が十分小さい場合、再帰の過程でとなります。この時、をとして返せばよいです。
が大きい場合
深さが1増えると子の数は2倍になります。
深さから、60回深いところに進むと、番目の文字は全ての子孫であることがわかります。
の最大値はであることから、から60回ほど親を遡ったところをとすれば、深さの番目の文字は全ての子孫となります。
ある深さにおけるは、全ての左子ノードを回進んだ文字であるので、することで求められます。
以上より、再帰においてを1/2していくと、高々60回ほどで、となります。このとき、をとして返すようにすればよいです。
提出コード(公式とほぼ同じ)