ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ARC103 E - Tr/ee

問題
提出コード

解法

考察は終わっていましたが実装が間に合いませんでした。
まず、木を作るのに必要な要素は3つあります。

  1. sの最後の文字が0
    辺を1つ選んだ時点で、サイズはnより小さくなってしまうので、条件を満たすことができません。

  2. sの最初の文字が1
    葉につながっている辺を切断すると、サイズが1の連結成分が必ず作成されます。
    なので、ここが0であった場合、条件を満たすことができません。

  3. sの1文字目からn-1文字目までが回文になっている
    というのは、i文字目とn-i文字目の文字が一致している、ということです。
    辺を1つ切ると、連結成分は2つにわかれます。
    サイズiの連結成分が作成されたとき、もう片方のサイズはn-iになります。
    なので、このような条件が満たされていないと、答えは-1になります。

逆に、以上の条件を満たすことができれば、必ず問題の条件を満たすような木を作成することができます。
木を作成する際に、現在までに追加し終えた頂点と、まだ追加してない頂点の個数を利用し、条件を満たすような木を作成していきます。
具体的には以下のようにして作成することができます。

まず、変数を2つ用意して、1つは次に追加する頂点の番号(cntとします)、もう1つはcntを次に繋ぐべき頂点の番号(nowとします)というように定義します。
初期はcnt が2、nowが1です。
sのi文字目が1か0で場合分けをします。

  • 1のとき
    cntとnowを辺で繋ぎます。
    最後に、nowにcntに代入し、その後でcntに1を加えます。

  • 0のとき cntとnowを辺で繋ぎます。
    cntに1を加え、操作を終了します。

この操作を繰り返すだけで、条件を満たす木を作成することができます。