giriş
Böylece son ek sıralama algoritmalarını araştırarak, yeni fikirleri elle ve kodla değerlendirerek zamanımı boşa harcıyorum. Ama her zaman eklerimin türünü hatırlamak için mücadele ediyorum! Son eklerimin ne tür olduğunu söyleyebilir misiniz?
En çok ne kaldı?
Bir çok sonek sıralama algoritması (SAIS, KA, kendi daware'im) grubu, bunları sıralamak için farklı türlere ekler. İki temel tip vardır: S-tipi ve L-tipi sonekler. S-tipi sonekler , aşağıdaki sonekten sözlükbilimsel olarak daha az ( S maller) ve sözlükbilimsel olarak daha büyükse L-tipi ( L arger) soneklerdir. Bir sol-en S-tipi ( LMS-tipi ) sadece ki: A S-tipi bir önce geldiği son ek L-tipi son eki.
Bu LMS tipi soneklerle ilgili özel şey , bunları sıraladıktan sonra diğer tüm sonekleri doğrusal zamanda sıralayabilmemizdir! Harika değil mi?
Meydan okuma
Bir dize verildiğinde, bu dizedeki diğer karakterlerden daha az özel bir karakterle sonlandığını varsayalım (örneğin, boş bayttan bile küçük). Her son ek için bir tür aşındırıcı karakter çıktısı alın.
Özgürce hangi türü için kullanılacak karakter seçebilir ama tercih ediyorum L, S and *
için L-, S- and LMS-type
sürece oldukları gibi tüm yazdırılabilir ( 0x20 - 0x7E
).
Misal
Dize mmiissiissiippi
çıktısı verildiğinde (kullanırken L, S and *
):
LL*SLL*SLL*SLLL
Örneğin birincisi L
, mmiissiissiippi$
sözlükbilimsel olarak büyük olandan kaynaklanmaktadır miissiissiippi$
( $
eklenen minimum karakteri temsil eder):
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$ > $
Bazı örnekler:
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
Hedef
Peter Cordes'ı kızdırmak için burada değilim (bunu bir zamanlar yığın akışı üzerinde yapacağım); Bu yüzden elbette kod golfü çok tembelim ! Bayt cinsinden en kısa cevap kazanır.
Düzenleme: Karakterlerin sırası bayt değerlerine göre verilir. Yani karşılaştırma C'ler gibi olmalı strcmp
.
Edit2: Yorumlarda belirtildiği gibi çıktı her girdi karakteri için tek bir karakter olmalıdır. Ben "bir dize döndür" olarak anlaşılacağı varsayılırken, en az 1 cevap tek karakterlerin bir listesini döndürür gibi görünüyor. Mevcut cevapları geçersiz kılmamak için tek karakterlerin (veya yazdırıldığında sadece 1 karakterle sonuçlanan tam sayıların) bir listesini döndürmenize izin vereceğim.
Doğrusal zaman için ipuçları:
- 2 paralel ileri yineleme veya tek bir geriye dönük yineleme ile yapılabilir.
- Her son ekin durumu yalnızca ilk 2 karaktere ve ikincisinin türüne bağlıdır.
- Girişi ters yönde tarayarak L veya S'yi şu şekilde belirleyebilirsiniz:
$t=$c<=>$d?:$t
(PHP 7), önceki ve önceki türün$c
geçerli karakteridir .$d
$t
- PHP cevabımı görün . Yarın ödülü vereceğim.
c++
stil dizeleri için boş bayt bile . Bunu ikili veri olarak düşünün.
*
geliyor?
*
, karşılık gelen sonek türünde olduğu anlamına gelir left most s-type
. A S-type suffix that is preceeded by a L-type suffix.
.