はじめに
そのため、サフィックスソーティングアルゴリズムの研究、手作業およびコードによる新しいアイデアの評価に再び時間を費やしてきました。しかし、私はいつも自分のサフィックスのタイプを覚えるのに苦労しています!私のサフィックスのタイプを教えていただけますか?
左端何?
多くのサフィックスソートアルゴリズム(SAIS、KA、私自身のdaware)は、サフィックスをさまざまなタイプにグループ化してソートします。SタイプとLタイプの2つの基本タイプがあります。Sタイプのサフィックスは、次のサフィックスよりも辞書順で小さい(S小さい)接尾辞であり、それが辞書順で大きい場合(Lアーガー)はLタイプです。左端のS型(LMS型)だけのことである:A S型が付け加えているサフィックスL型接尾辞。
これらのLMSタイプのサフィックスの特別な点は、一度ソートすると、他のすべてのサフィックスを線形時間でソートできることです。すごくないですか?
チャレンジ
文字列が指定された場合、その文字列内の他のどの文字よりも小さい(たとえば、nullバイトよりも小さい)特殊文字で終了すると想定します。各サフィックスのタイプ対応する文字を出力します。
どのタイプにどのcharを使用するかは自由に選択できますが、すべて印刷可能である限り()は好きL, S and *
です。L-, S- and LMS-type
0x20 - 0x7E
例
文字列mmiissiissiippi
出力がある場合(を使用する場合L, S and *
):
LL*SLL*SLL*SLLL
たとえば、1つ目L
は、mmiissiissiippi$
辞書式にmiissiissiippi$
($
追加された最小文字を表す)よりも大きいという事実によるものです。
L - mmiissiissiippi$ > miissiissiippi$
L - miissiissiippi$ > iissiissiippi$
* - iissiissiippi$ < issiissiippi and preceeded by L
S - issiissiippi$ < ssiissiippi$
L - ssiissiippi$ > siissiippi$
L - siissiippi$ > iissiippi$
* - iissiippi$ < issiippi$ and preceeded by L
S - issiippi$ < ssiippi$
L - ssiippi$ > siippi$
L - siippi$ > iippi$
* - iippi$ < ippi$ and preceeded by L
S - ippi$ < ppi$
L - ppi$ > pi$
L - pi$ > i$
L - i$ > $
さらにいくつかの例:
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
ゴール
私はピーター・コーデスを困らせるためにここにいるわけではありません(いつかスタックオーバーフローでこれをやるつもりです)。私は非常に怠惰なので、これはもちろんコードゴルフです!バイト単位の最短の回答が優先されます。
編集:文字の順序は、バイト値によって指定されます。つまり、compareはCのようになりますstrcmp
。
Edit2:コメントで述べたように、出力は各入力文字に対して単一の文字でなければなりません。私はそれが「文字列を返す」と理解されると仮定しましたが、少なくとも1つの回答が単一の文字のリストを返すようです。既存の回答を無効にしないために、単一の文字(または出力時に1文字のみの結果となる整数)のリストを返すことができます。
線形時間のヒント:
- これは、2つの並列フォワード反復または単一のバックワード反復で実行できます。
- 各サフィックスの状態は、最初の2文字と2番目の文字のタイプにのみ依存します。
- 逆方向入力をスキャンするこのようなLまたはSを決定することができる:
$t=$c<=>$d?:$t
(PHP 7)、ここで、$c
現在の文字が$d
前と$t
前タイプ。 - PHPの回答をご覧ください。明日、賞金を授与します。
c++
スタイル文字列のnullバイトなど)。バイナリデータと考えてください。
*
意味ですか?
*
は、対応するサフィックスがタイプであることを意味しleft most s-type
ます。A S-type suffix that is preceeded by a L-type suffix.
。