Intro
Deshalb habe ich wieder meine Zeit damit verschwendet, nach Suffix-Sortieralgorithmen zu suchen und neue Ideen von Hand und im Code zu bewerten. Aber ich habe immer Mühe, mich an die Art meiner Suffixe zu erinnern! Können Sie mir sagen, welcher Typ meine Suffixe sind?
Ganz links was?
Viele Suffix-Sortieralgorithmen (SAIS, KA, meine eigene Daware) gruppieren Suffixe in verschiedene Typen, um sie zu sortieren. Es gibt zwei Grundtypen: S-Typ- und L-Typ- Suffixe. Suffixe vom Typ S sind Suffixe, die lexikographisch kleiner ( S maller) sind als das folgende Suffix und L-Typ, wenn sie lexikographisch größer sind ( L arger). Ein S-Typ ganz links ( LMS-Typ ) ist genau das: Ein S-Typ- Suffix, dem ein L-Typ- Suffix vorangestellt ist .
Das Besondere an diesen Suffixen vom Typ LMS ist, dass wir nach dem Sortieren alle anderen Suffixe in linearer Zeit sortieren können! Ist das nicht großartig?
Die Herausforderung
Angenommen, eine Zeichenfolge wird durch ein Sonderzeichen abgeschlossen, das kleiner als jedes andere Zeichen in dieser Zeichenfolge ist (z. B. kleiner als das Nullbyte). Geben Sie für jedes Suffix ein entsprechendes Zeichen aus.
Sie können frei wählen , welche Zeichen für welche Art zu verwenden , aber ich würde es vorziehen , L, S and *
für L-, S- and LMS-type
so lange , wie sie alle druckbaren sind ( 0x20 - 0x7E
).
Beispiel
Angesichts der String- mmiissiissiippi
Ausgabe (bei Verwendung L, S and *
):
LL*SLL*SLL*SLLL
Zum Beispiel ist das erste L
auf die Tatsache zurückzuführen, dass mmiissiissiippi$
es lexikographisch größer ist als miissiissiippi$
(das $
repräsentiert das hinzugefügte Minimalzeichen):
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$ > $
Einige weitere Beispiele:
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
Tor
Ich bin nicht hier, um Peter Cordes zu ärgern (ich werde das irgendwann beim Stackoverflow tun); Ich bin nur sehr faul, das ist natürlich Code-Golf ! Die kürzeste Antwort in Bytes gewinnt.
Bearbeiten: Die Reihenfolge der Zeichen wird durch ihren Bytewert angegeben. Das heißt, vergleichen sollte wie C sein strcmp
.
Edit2: Wie in den Kommentaren angegeben, sollte die Ausgabe für jedes Eingabezeichen ein einzelnes Zeichen sein. Obwohl ich davon ausgegangen bin, dass dies als "Rückgabe einer Zeichenfolge" verstanden wird, scheint mindestens 1 Antwort eine Liste einzelner Zeichen zurückzugeben. Um die vorhandenen Antworten nicht ungültig zu machen, können Sie eine Liste einzelner Zeichen (oder Ganzzahlen, die beim Drucken nur 1 Zeichen ergeben) zurückgeben.
Tipps für die lineare Zeit:
- Dies kann in 2 parallelen Vorwärtsiterationen oder in einer einzelnen Rückwärtsiteration erfolgen.
- Der Status jedes Suffix hängt nur von den ersten beiden Zeichen und dem Typ des zweiten ab.
- Durch Scannen des Eingangs in umgekehrter Richtung können Sie L oder S wie folgt bestimmen:
$t=$c<=>$d?:$t
(PHP 7), wobei$c
das aktuelle Zeichen$d
der vorherige und$t
der vorherige Typ ist. - Siehe meine PHP-Antwort . Morgen werde ich das Kopfgeld vergeben.
c++
. Betrachten Sie es als binäre Daten.
*
das
*
bedeutet, dass das entsprechende Suffix vom Typ ist left most s-type
. A S-type suffix that is preceeded by a L-type suffix.
.