สองสายความยาวkแตกต่างกันในตัวละครตัวหนึ่งแบ่งปันคำนำหน้าของความยาวLและคำต่อท้ายของความยาวเมตรเช่นที่k = L + m + 1
คำตอบโดยไซมอน Prins encodes นี้โดยการจัดเก็บทุกคำนำหน้า / ต่อท้ายอยู่รวมกันอย่างชัดเจนคือabc
จะกลายเป็น*bc
, และa*c
ab*
นั่นคือ k = 3, l = 0,1,2 และ m = 2,1,0
เมื่อ valarMorghulis ชี้ให้เห็นคุณสามารถจัดระเบียบคำต่าง ๆ ในแผนผังคำนำหน้า นอกจากนี้ยังมีต้นไม้ต่อท้ายที่คล้ายกันมาก มันค่อนข้างง่ายที่จะเพิ่มต้นไม้ด้วยจำนวนของโหนดใบด้านล่างแต่ละคำนำหน้าหรือคำต่อท้าย; สามารถอัปเดตเป็น O (k) เมื่อแทรกคำใหม่
เหตุผลที่คุณต้องการนับพี่น้องเหล่านี้คือเพื่อให้คุณรู้คำใหม่ไม่ว่าคุณต้องการที่จะระบุสตริงทั้งหมดด้วยคำนำหน้าเดียวกันหรือว่าจะระบุสตริงทั้งหมดด้วยคำต่อท้ายเดียวกัน เช่นสำหรับ "abc" เป็นอินพุตคำนำหน้าที่เป็นไปได้คือ "", "a" และ "ab" ในขณะที่คำต่อท้ายที่สอดคล้องกันคือ "bc", "c" และ "" ตามที่เห็นได้ชัดสำหรับคำต่อท้ายสั้น ๆ ดีกว่าที่จะแจกแจงพี่น้องในต้นไม้คำนำหน้าและในทางกลับกัน
@einpoklum ชี้ให้เห็นว่าเป็นไปได้ที่สตริงทั้งหมดจะมีค่าk / 2เหมือนกันคำนำหน้าเหมือนกัน นั่นไม่ใช่ปัญหาสำหรับวิธีนี้ ต้นไม้คำนำหน้าจะเป็นเชิงเส้นสูงถึงความลึก k / 2 โดยแต่ละโหนดถึงความลึก k / 2 เป็นบรรพบุรุษของโหนดใบ 100.000 เป็นผลให้ต้นไม้ต่อท้ายจะใช้ความลึกสูงสุด (k / 2-1) ซึ่งเป็นสิ่งที่ดีเพราะสตริงจะต้องแตกต่างกันในส่วนต่อท้ายของพวกเขาเนื่องจากพวกเขาแบ่งปันคำนำหน้า
[แก้ไข] ในฐานะของการเพิ่มประสิทธิภาพเมื่อคุณได้กำหนดคำนำหน้าสั้น ๆ ที่ไม่ซ้ำกันของสตริงคุณจะรู้ว่าหากมีอักขระที่แตกต่างกันหนึ่งตัวจะต้องเป็นอักขระตัวสุดท้ายของคำนำหน้าและคุณจะพบสิ่งที่ใกล้เคียงกันเมื่อ ตรวจสอบคำนำหน้าที่สั้นกว่า ดังนั้นถ้า "abcde" มีคำนำหน้าสั้นที่สุดที่ไม่ซ้ำกัน "abc" นั่นหมายความว่ามีสตริงอื่น ๆ ที่ขึ้นต้นด้วย "ab?" แต่ไม่ใช่ด้วย "abc" นั่นคือถ้าพวกเขาต่างกันในตัวละครเดียวนั่นก็คือตัวละครตัวที่สาม คุณไม่จำเป็นต้องตรวจสอบ "abc? e" อีกต่อไป
โดยตรรกะเดียวกันถ้าคุณจะพบว่า "cde" เป็นคำต่อท้ายที่สั้นที่สุดที่ไม่ซ้ำกันแล้วคุณรู้ว่าคุณต้องตรวจสอบเฉพาะคำนำหน้าความยาว 2 "ab" และไม่นำหน้า 1 หรือ 3 ความยาว
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะกับความแตกต่างของตัวละครหนึ่งตัวเท่านั้นและไม่ได้สรุปถึงความแตกต่างของตัวละคร 2 ตัวโดยอาศัยหนึ่งตัวละครหนึ่งตัวซึ่งเป็นการแยกระหว่างคำนำหน้าเหมือนกันและคำต่อท้ายที่เหมือนกัน