文字の数があわないなどの自明ケースは先に考慮しておく。
実際にtitech
という文字列をいくつか作りかけながら、文字列Sを先頭から走査していくことを考える。たとえばtit
という文字列が2つできているときに次がe
だったら、どちらに追加しても区別できない。したがって、長さxの列をdp[x]個持っているとしてdp[0]:=Sの長さ/6と初期化しておけばよく、e
を見たらdp[3]を1減らしてdp[4]を1増やすという感じで遷移すればよい。ほかの文字についてもだいたい同じで、最後まで走査できたらYes
ということになる……のだが、問題は文字t
で、0→1と2→3の二通りに追加できる。これはDFSで全探索すればよさそう。
しかし、計算量がどうなるかわからなくてしばらく逡巡していた。自明な評価から順に
titech
は最大で16個作れてこの時t
は32個だからDFSの末端の数は232≃4⋅109以下。
- 0→1と2→3は同じ回数だけ選ぶ必要があるから(1632)≃6⋅108以下。
- 最初は0→1、最後は2→3を選ぶ必要があるから(1530)≃1.5⋅108以下。
- 0→1を選んだ回数が常に2→3を選んだ回数以上でなければならないから、カタラン数でC15≃107以下。
逆から貪欲でいいらしい。なんと……