Intro
ดังนั้นฉันจึงเสียเวลาไปกับการค้นคว้าขั้นตอนวิธีการเรียงลำดับคำต่อท้ายประเมินความคิดใหม่ด้วยมือและในโค้ด แต่ฉันมักจะพยายามจำประเภทของคำต่อท้ายของฉัน! คุณบอกฉันได้ไหมว่าคำต่อท้ายของฉันคืออะไร?
ซ้ายสุดอะไรนะ?
อัลกอริทึมการเรียงลำดับคำต่อท้าย (SAIS, KA, daware ของฉันเอง) ต่อท้ายกลุ่มเป็นประเภทต่างๆเพื่อเรียงลำดับ ประเภทพื้นฐานมีสองประเภทคือ: S-typeและL-typeต่อท้าย S-type suffixes เป็นคำต่อท้ายที่น้อยกว่า lexicographically ( S maller) กว่าคำต่อท้ายและL-typeถ้ามันเป็น lexicographically มากกว่า ( L arger) ซ้ายสุดประเภท S ( LMS ชนิด ) เป็นเพียงที่: เป็นประเภท Sต่อท้ายที่นำหน้าด้วยL-ชนิดคำต่อท้าย
สิ่งพิเศษเกี่ยวกับคำต่อท้ายชนิด LMSเหล่านี้คือเมื่อเราจัดเรียงพวกเขาเราสามารถเรียงลำดับคำต่อท้ายอื่น ๆ ทั้งหมดในเวลาเชิงเส้น! มันยอดเยี่ยมใช่ไหม
ความท้าทาย
รับสายคิดว่ามันจะถูกยกเลิกโดยตัวละครพิเศษที่น้อยกว่าตัวละครอื่น ๆ ในสตริงที่ (เช่นเล็กกว่าแม้กระทั่ง null null) เอาท์พุทประเภทการกัดกร่อนการถ่านสำหรับแต่ละคำต่อท้าย
คุณได้อย่างอิสระสามารถเลือกได้ว่าถ่านที่จะใช้สำหรับประเภท แต่ฉันต้องการL, S and *
สำหรับL-, S- and LMS-type
ตราบเท่าที่พวกเขาทั้งหมดที่พิมพ์ ( 0x20 - 0x7E
)
ตัวอย่าง
รับmmiissiissiippi
เอาท์พุทสตริง(เมื่อใช้L, S and *
):
LL*SLL*SLL*SLLL
ตัวอย่างแรก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"
เป้าหมาย
ฉันไม่ได้มาที่นี่เพื่อรบกวน Peter Cordes (ฉันจะทำสิ่งนี้ใน stackoverflow บางครั้ง); ฉันขี้เกียจมาก ๆ ดังนั้นนี่เป็นสนามกอล์ฟแน่นอน! คำตอบที่สั้นที่สุดเป็นไบต์ชนะ
แก้ไข: ลำดับของตัวอักษรถูกกำหนดโดยค่าไบต์ strcmp
นั่นหมายถึงการเปรียบเทียบควรเป็นเช่นซี
แก้ไข 2: เช่นเดียวกับที่ระบุในเอาต์พุตความคิดเห็นควรเป็นอักขระตัวเดียวสำหรับแต่ละอักขระอินพุต ในขณะที่ฉันคิดว่าจะเข้าใจได้ว่า "คืนสตริง" ดูเหมือนว่าอย่างน้อย 1 คำตอบจะส่งกลับรายการของอักขระเดี่ยว เพื่อที่จะไม่ทำให้คำตอบที่มีอยู่นั้นไม่ถูกต้องฉันจะอนุญาตให้คุณส่งคืนรายการของอักขระเดี่ยว (หรือจำนวนเต็มซึ่งเมื่อพิมพ์ผลลัพธ์ใน 1 อักขระเท่านั้น)
เคล็ดลับสำหรับเวลาเชิงเส้น:
- มันสามารถทำได้ใน 2 ซ้ำไปข้างหน้าขนานหรือในการทำซ้ำย้อนหลังเดียว
- สถานะของคำต่อท้ายแต่ละรายการจะขึ้นอยู่กับ 2 ตัวอักษรแรกและประเภทที่สองเท่านั้น
- การสแกนอินพุตในทิศทางกลับกันคุณสามารถกำหนด L หรือ S ดังนี้:
$t=$c<=>$d?:$t
(PHP 7) โดยที่$c
char ปัจจุบันเป็นชนิด$d
ก่อนหน้าและ$t
ชนิดก่อนหน้า - ดูของฉันคำตอบ PHP พรุ่งนี้ฉันจะมอบรางวัลให้
c++
สตริงสไตล์ คิดว่ามันเป็นข้อมูลไบนารี
*
หมายถึง?
*
. left most s-type
A S-type suffix that is preceeded by a L-type suffix.