2020年3月17日火曜日

TTPC 2015 G - titech分離

文字の数があわないなどの自明ケースは先に考慮しておく。

実際にtitechという文字列をいくつか作りかけながら、文字列SSを先頭から走査していくことを考える。たとえばtitという文字列が2つできているときに次がeだったら、どちらに追加しても区別できない。したがって、長さxxの列をdp[x]\operatorname{dp}[x]個持っているとしてdp[0]:=Sの長さ/6\operatorname{dp}[0] := Sの長さ/6と初期化しておけばよく、eを見たらdp[3]\operatorname{dp}[3]を1減らしてdp[4]\operatorname{dp}[4]を1増やすという感じで遷移すればよい。ほかの文字についてもだいたい同じで、最後まで走査できたらYesということになる……のだが、問題は文字tで、010 \rightarrow 1232 \rightarrow 3の二通りに追加できる。これはDFSで全探索すればよさそう。

しかし、計算量がどうなるかわからなくてしばらく逡巡していた。自明な評価から順に

  1. titechは最大で16個作れてこの時tは32個だからDFSの末端の数は23241092^{32} \simeq 4 \cdot 10^9以下。
  2. 010 \rightarrow 1232 \rightarrow 3は同じ回数だけ選ぶ必要があるから(3216)6108\binom{32}{16} \simeq 6 \cdot 10^8以下。
  3. 最初は010 \rightarrow 1、最後は232 \rightarrow 3を選ぶ必要があるから(3015)1.5108\binom{30}{15} \simeq 1.5 \cdot 10^8以下。
  4. 010 \rightarrow 1を選んだ回数が常に232 \rightarrow 3を選んだ回数以上でなければならないから、カタラン数でC15107C_{15} \simeq 10^7以下。

逆から貪欲でいいらしい。なんと……