概要


この問題特有の規則性に気付けるかがポイントです.
丁寧に実験をしたり考察をすることで正解できます.

問題原案:uni_kakurenbo

略解


長さを最小にするには, つめの操作をできるだけ行う必要があります.

A, T, U は,適切に U を経由することでどの文字にも置換が可能です. C, G は互いの文字にしかなることができません.

つめの操作の対象となる,連続した 文字は,A, T, U で始まっていなければなりません.
逆に,後ろの 文字は何であっても問題ないことが分かります.

操作後の文字は AC であり,これは頭文字を T に置換できます.
よって,最初に出現する A, T, U のいずれかで始まる,長さが 以上の連続部分文字列はすべて操作を行う対象になります.

CGATU とします.

操作後の文字列を作り(末尾を AC で置き換えて), に属するなら をかけて, に属するなら を掛ければコーナーケースにも対応できます.

一度も操作ができない場合に注意してください.

解説


概略

文字列の長さが減少する操作は つ目のもの(TGCAC)のみです.

また,文字 U は任意の文字へ変換でき,A, T についても U を経由することで任意の文字に変換できます.GC へ変換できます.
ゆえに,長さが の任意な文字列から,CCC..CC といったように C 個連なった文字列を作ることができます.

さらに,文字列 CCC..CC の先頭へ T を追加した文字列 TCCC..CC は,TGCC..C と変換でき,TGC の部分は AC を経由して TG に変換できるため,結果的に TGCC..CC から TGCC..C (C が一つ少ない文字列) を作ることができます.

したがって,再帰的に考えると,X を任意の文字として,適当な長さの文字列 TXXXXX..X から,長さ の文字列 AC を作ることができます.

以上のことと,A, UT へ変換できることを踏まえると,文字列 において最初に現れる G, C 以外の文字の位置を とするとき,
のうちで 以降の文字列は AC へと変換でき,残った長さ の文字列が最小になるということが示せます.
(C, Gのみからなる文字列に操作を行って T を含むようにすることはできない.)

残った文字列の形は,PC, G のいずれかとして,PP..PPAC となります.

P に当てはまるものの選び方は, 通り,
A は任意の文字へ変換できるため, 通り,
末尾の CG に変換できるため 通り
となります.

以上より,答えは 通り です.

PC, G のいずれか,QA, T, U のいずれかとして,PP...PP のときと PP..PPQQ のときがコーナーケースとなります.
(前者は ,後者は )

実装時には,操作後の文字列を実際に生成することで,これらのコーナーケースにも対応可能です.

発展

類題

実装例


Python

余談

トリを飾る問題ですから,TGC を題材にしたいという思いで作問しました.
TGC, よくよく見てみるとすべて有名な塩基の略称として存在するんですよね.

これは使うしかないと思いました()

ARC-A のような問題も作ってみたいという思いがあったため,最終的にこのような形となりました.
実装量は極力少なくしたつもりです.

楽しんでいただけたでしょうか?