この問題は 3重ループ を問います。
問題文の指示をそのまま実装することを考えると、「 の中のうちどの文字の間に を挿入するか?」ということを考慮しなくてはならなくなります。
これを全探索すると最悪 要することになり、実際に に を挿入して検査する必要があるのでこの挿入に最悪 、全体で の時間を要します。
また「 においてどこからどこまでを にするか?」ということも同時に管理する必要があり、これは 文字目から 文字目までの連続部分文字列を取り出すことも必要になります。
これも全探索すると を要することになります。
以上を踏まえるとこの方針での計算量は となります。
しかし今回の制約では上の方針では制限時間に間に合うことはできません。
ここで「(のいずれか 文字の間)に を挿入」という考え方を、「 から を取り出す」という考えに変換してみます。
すると から任意の区間 に該当する連続部分文字列を取得すればよく、この区間に該当しない文字列を「飛ばす」ことで一つの区間のみで実装をすることができます。
つまりこの発想によって
の つの情報を取得することができます。
後者における文字列 は、問題文から は から何らかの連続部分文字列 を取り出して連結させたものであるので、これに対して利用することができます。
つまり が に等しくなった場合、取り出した文字列 が の元の情報になる、ということになります。
こうして得られた から は容易に復元することができます。この場合 とすることで復元できます※1。
また問題の制約上、答えとなる は一意に定まることから、復元ができたところで処理を終えても問題ありません。
以上の方針で実装することで、計算量は ※2 でこの問題を正解することができます。
解答例(C++)では を skipped_str という変数で管理しています。
※
例えば ScottishFold から Fold を取り出すことを考えます。
このとき を取りだして ol となります。これは問題文の に相当します。
さらに のこの順でつなげた文字列が Fold となります。これは に一致します。
※2
を作る段階で余分に 1 重ループが必要になるためです。また文字列比較の計算量が であるためです。