SRM301 Div2 500

問題

4つの記号「/」「N(バックスラッシュの代わり)」「|」「-」からなる列が与えられる。
記号に対して、4つの操作R(右に回転)、L(左に回転)、F(フリップ)、S(なにもしない)をするとそれに応じた記号に代わる。
与えられた記号列を生成するような操作列を「操作+数字2文字」からなる3文字をつなげた文字列で表現したい。後ろの数字は同じ操作の連続する数を表す。100回以上のときは「F01F99」のようにして表現する。
与えられた記号列を生成する操作列の文字列で辞書順最小となるものを返せ。
ただし、生成した操作列の文字列が100文字以上の場合は「先頭から97文字...」という文字列を返せ。

考え方

やるだけ。

記号列から操作列は一意に決まるので、FFSRRRFL...のように生成。
同じ記号が連続している数を数えて、100個を超える場合は「F01F99」、200個を超える場合は「F01F99F99」のように文字列を生成する。
全体の記号列は50*50文字まであり得るので、注意。

反省

ある2つ記号からどの操作をしたかを取り出したい場合、if文を並べてもよいけど、

string type = "/-N|";
string act  = "SRFL";

//char k1, k2;はひとつ前の記号と現在の記号

char ret = act[ (type.find(k2) - type.find(k1) + 4)%4 ];

のようにスマートに書ける。