พื้นหลัง
เหตุการณ์เป็นภาษาการเขียนโปรแกรมที่ค่อนข้างแปลกในรายการของโทเค็นไม่ได้กำหนดไว้ล่วงหน้า แต่อนุมานจากอินพุต ดังนั้นการโทเค็นโปรแกรมเหตุการณ์อาจค่อนข้างยากโดยเฉพาะอย่างยิ่งถ้าคุณต้องการทำอย่างมีประสิทธิภาพ งานนี้เกี่ยวกับการทำด้วยตัวเอง
งาน
โปรแกรมของคุณจะได้รับสตริงเป็นอินพุต นี่คืออัลกอริทึมที่เหตุการณ์ใช้เพื่อทำเครื่องหมาย:
- ระบุสตริงทั้งหมดที่เกิดขึ้นเป็นสตริงย่อยของอินพุตในสามวิธีอย่างแน่นอน (เช่นมีสตริงที่เกิดขึ้นสามครั้งภายในอินพุต)
- ยกเลิกสตริงใด ๆ ที่เป็นสตริงย่อยของสตริงอื่น (เช่นสำหรับอินพุต
ababab
สตริงที่เหลือเท่านั้นจะab
ไม่ใช่a
หรือb
เพราะa
และb
เป็นสตริงย่อยของทั้งสองab
) - ยกเลิกสตริงใด ๆ ที่ทับซ้อนกันภายในอินพุต (ยกตัวอย่างเช่น
aaaa
มีเพียงแค่สามเล่มaa
แต่สำเนาเหล่านี้ทับซ้อนกันที่ตัวละครสองและสามนั้นจะถูกยกเลิก. ในทำนองเดียวกันในabababa
มีสามสำเนาab
และสามสำเนาของba
แต่สองตัวละครที่หกแต่ละที่ ทับซ้อนของab
และba
ดังนั้นทั้งสองab
และba
จะถูกทิ้ง) - สตริงใด ๆ ที่ยังคงอยู่ ณ จุดนี้เป็นโทเค็นที่ใช้โดยโปรแกรม โทเค็นอินพุตต้นฉบับเป็นลำดับโทเค็นเหล่านี้ (เนื่องจากการละทิ้งในขั้นตอนก่อนหน้าจะมีเพียงวิธีเดียวเท่านั้นที่ทำได้) อักขระใด ๆ ในอินพุตที่ไม่ได้เป็นส่วนหนึ่งของโทเค็นจะถือว่าเป็นความคิดเห็นและถูกละทิ้ง
โปรแกรมของคุณจะต้องใช้สตริงเป็นอินพุตและส่งกลับโทเค็นที่สอดคล้องกันของสตริง (รายการโทเค็นซึ่งแต่ละรายการจะแสดงเป็นสตริง) เป็นเอาต์พุต นอกจากนี้สิ่งนี้จะต้องทำอย่างน้อยในระดับปานกลางอย่างมีประสิทธิภาพ โดยเฉพาะโปรแกรมจะต้องทำงานในเวลากำลังสอง ("O (n²)") หรือดีกว่า (บังเอิญมันเป็นไปได้ที่จะเร็วกว่าสมการกำลังสอง แต่นี่ไม่ใช่อัลกอริธึมที่เร็วที่สุดดังนั้นอย่าลังเลที่จะใช้อัลกอริธึมที่ยากที่สุดที่คุณจะพบว่าเหมาะกับขอบเขตความซับซ้อน)
ชี้แจง
- แม้ว่าในทางทฤษฎีแล้วโปรแกรมสามารถมี 256 octets ใด ๆ ก็ตามมันเป็นที่ยอมรับได้สำหรับวัตถุประสงค์ของการท้าทายนี้สำหรับโปรแกรมของคุณที่จะจัดการเฉพาะอินพุตที่เกิดขึ้นจาก ASCII ที่พิมพ์ได้ (รวมถึงช่องว่าง) รวมถึงบรรทัดใหม่และแท็บ (โปรแกรมเหตุการณ์ที่รู้จักทั้งหมด จำกัด ตัวเองไว้ในชุดย่อยนี้) โปรดทราบว่าช่องว่าง / บรรทัดใหม่ / แท็บไม่ได้พิเศษและสามารถปรากฏในกลางโทเค็น เหตุการณ์ถือว่า 256 octets ทั้งหมดเป็นทึบแสง
- คำจำกัดความของ "กำลังสองกำลังสอง" คือ "ถ้าขนาดของอินพุตเป็นสองเท่าโปรแกรมจะทำงานช้าลงโดยไม่เกินค่าคงที่บวกกับปัจจัย 4" คือถ้าt ( x ) เป็นเวลาสูงสุดที่โปรแกรมของคุณใช้เพื่อ ดำเนินการป้อนข้อมูลของขนาดxแล้วจะต้องมีอย่างต่อเนื่องบางkดังกล่าวว่าที (2 x ) <4 T ( x ) + kสำหรับทุกx โปรดจำไว้ว่าการเปรียบเทียบสตริงต้องใช้เวลาเป็นสัดส่วนกับความยาวของสตริง
- โปรแกรมของคุณในทางทฤษฎีควรสามารถจัดการกับโปรแกรมอินพุตที่มีความยาวเท่าใดก็ได้หากใช้งานในภาษาของคุณที่มีหน่วยความจำไม่ จำกัด และใช้จำนวนเต็มที่ไม่ จำกัด (มันก็โอเคถ้าโปรแกรมล้มเหลวในการบรรลุเป้าหมายนี้ จำนวนเต็มหรือหน่วยความจำของภาษามีขนาดใหญ่มากจริง ๆ ) คุณอาจจะสมมติ (สำหรับจุดประสงค์ในการคำนวณความซับซ้อน) ว่าจำนวนเต็มที่ไม่เกินความยาวของอินพุตสามารถเปรียบเทียบได้ในเวลาคงที่ (แม้ว่าโปรดทราบว่าหากคุณใช้ค่าที่มีขนาดใหญ่กว่าเช่นเนื่องจากการแปลงอินพุตเป็น จำนวนเต็มเดียวพวกเขาจะใช้เวลาในการเปรียบเทียบสัดส่วนกับจำนวนหลักที่พวกเขามี)
- คุณสามารถใช้อัลกอริทึมใดก็ได้ที่เหมาะกับขอบเขตความซับซ้อนแม้ว่ามันจะไม่ปฏิบัติตามขั้นตอนเดียวกับอัลกอริทึมที่โพสต์ข้างต้นตราบใดที่มันให้ผลลัพธ์ที่เหมือนกัน
- ปริศนานี้เกี่ยวกับการโทเค็นอินพุตไม่ใช่การจัดรูปแบบเอาต์พุตจริง ๆ หากวิธีที่เป็นธรรมชาติที่สุดในการส่งออกรายการในภาษาของคุณเกี่ยวข้องกับรูปแบบที่คลุมเครือ (เช่นการขึ้นบรรทัดใหม่คั่นเมื่อสตริงมีการขึ้นบรรทัดใหม่ตามตัวอักษรหรือไม่มีตัวคั่นระหว่างสตริง) ไม่ต้องกังวลเกี่ยวกับข้อเท็จจริงที่ว่า ตราบใดที่รายการถูกสร้างขึ้นจริง) คุณอาจต้องการสร้างเวอร์ชันที่สองของการส่งของคุณที่สร้างผลลัพธ์ที่ไม่น่าสงสัยเพื่อช่วยในการทดสอบ แต่เวอร์ชันดั้งเดิมเป็นเวอร์ชันที่นับสำหรับการให้คะแนน
กรณีทดสอบ
สำหรับสตริงอินพุตต่อไปนี้:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
โปรแกรมของคุณควรสร้างรายการผลลัพธ์ต่อไปนี้:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
เงื่อนไขชัยชนะ
นี่คือโค้ดกอล์ฟดังนั้นโปรแกรมที่ถูกต้องที่สุด (เช่นพฤติกรรมอินพุต / เอาต์พุตที่ถูกต้องและรวดเร็วเพียงพอที่จะเรียกใช้) โปรแกรมวัดเป็นไบต์ชนะ