Intro
Jadi saya sudah membuang-buang waktu lagi meneliti algoritma penyortiran suffix, mengevaluasi ide-ide baru dengan tangan dan dalam kode. Tapi saya selalu berjuang untuk mengingat tipe sufiks saya! Bisakah Anda memberi tahu saya tipe sufiks yang mana?
Paling kiri apa?
Banyak algoritma penyortiran sufiks (SAIS, KA, saya sendiri yang tahu) sufiks menjadi tipe yang berbeda untuk mengurutkannya. Ada dua tipe dasar: sufiks tipe- S dan tipe - L . Sufiks tipe-S adalah sufiks yang secara leksikografis lebih sedikit ( S maller) daripada sufiks berikut dan tipe-L jika sufiksnya lebih besar ( L arger). Sebuah kiri-paling S-type ( LMS-jenis ) hanya itu: A S-jenis akhiran yang diawali dengan L-jenis akhiran.
Hal khusus tentang sufiks tipe-LMS ini adalah bahwa begitu kami mengurutkannya, kami dapat mengurutkan semua sufiks lain dalam waktu linier! Bukankah itu luar biasa?
Tantangan
Diberikan string menganggap itu diakhiri oleh karakter khusus yang kurang dari karakter lain dalam string itu (misalnya lebih kecil daripada byte nol). Keluarkan jenis corrosponding char untuk setiap suffix.
Anda dapat dengan bebas memilih char digunakan untuk jenis tapi aku lebih suka L, S and *
untuk L-, S- and LMS-type
selama mereka semua dicetak ( 0x20 - 0x7E
).
Contoh
Diberikan mmiissiissiippi
keluaran string (saat menggunakan L, S and *
):
LL*SLL*SLL*SLLL
Misalnya yang pertama L
adalah karena fakta yang mmiissiissiippi$
secara leksikografis lebih besar dari miissiissiippi$
(yang $
mewakili karakter minimal yang ditambahkan):
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$ > $
Beberapa contoh lagi:
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
Tujuan
Saya di sini bukan untuk mengganggu Peter Cordes (kadang-kadang saya akan melakukan ini di stackoverflow); Saya sangat malas jadi ini tentu saja kode-golf ! Jawaban terpendek dalam byte menang.
Sunting: Urutan karakter diberikan oleh nilai byte mereka. Itu berarti membandingkan harus seperti C strcmp
.
Sunting2: Seperti yang dinyatakan dalam komentar komentar harus berupa karakter tunggal untuk setiap karakter input. Sementara saya berasumsi bahwa itu akan dipahami sebagai "mengembalikan sebuah string" tampaknya setidaknya 1 jawaban mengembalikan daftar karakter tunggal. Agar tidak membatalkan jawaban yang ada, saya akan memungkinkan Anda mengembalikan daftar karakter tunggal (atau bilangan bulat yang bila dicetak hanya menghasilkan 1 karakter).
Kiat untuk waktu linier:
- Ini dapat dilakukan dalam 2 iterasi maju paralel atau dalam satu iterasi mundur tunggal.
- Keadaan masing-masing sufiks hanya bergantung pada 2 karakter pertama dan tipe yang kedua.
- Memindai input dalam arah terbalik, Anda dapat menentukan L atau S seperti ini:
$t=$c<=>$d?:$t
(PHP 7), di mana$c
karakter saat ini$d
tipe sebelumnya dan$t
sebelumnya. - Lihat jawaban PHP saya . Besok aku akan menghadiahkan hadiah itu.
c++
string gaya. Anggap saja sebagai data biner.
*
artinya
*
berarti sufiks yang sesuai adalah tipe left most s-type
. A S-type suffix that is preceeded by a L-type suffix.
.