Hai chuỗi có độ dài k , khác nhau trong một ký tự, chia sẻ tiền tố có độ dài l và hậu tố có độ dài m sao cho k = l + m + 1 .
Câu trả lời của Simon Prins mã hóa này bằng cách lưu trữ tất cả các tiền tố / hậu tố kết hợp một cách rõ ràng, tức là abc
trở thành *bc
, a*c
và ab*
. Đó là k = 3, l = 0,1,2 và m = 2,1,0.
Như valarMorghulis chỉ ra, bạn có thể sắp xếp các từ trong cây tiền tố. Cũng có cây hậu tố rất giống nhau. Khá dễ dàng để tăng cây với số lượng nút lá bên dưới mỗi tiền tố hoặc hậu tố; điều này có thể được cập nhật trong O (k) khi chèn một từ mới.
Lý do bạn muốn các số anh chị em này là để bạn biết, đưa ra một từ mới, cho dù bạn muốn liệt kê tất cả các chuỗi có cùng một tiền tố hay liệu có thể liệt kê tất cả các chuỗi có cùng hậu tố hay không. Ví dụ: "abc" là đầu vào, các tiền tố có thể là "", "a" và "ab", trong khi các hậu tố tương ứng là "bc", "c" và "". Rõ ràng, đối với các hậu tố ngắn, tốt hơn là liệt kê anh chị em trong cây tiền tố và ngược lại.
Như @einpoklum chỉ ra, chắc chắn tất cả các chuỗi đều có chung tiền tố k / 2 . Đó không phải là vấn đề đối với phương pháp này; cây tiền tố sẽ được tuyến tính lên đến độ sâu k / 2 với mỗi nút có độ sâu tới k / 2 là tổ tiên của 100.000 nút lá. Do đó, cây hậu tố sẽ được sử dụng tới độ sâu (k / 2-1), điều này rất tốt vì các chuỗi phải khác nhau trong các hậu tố của chúng do chúng có chung tiền tố.
[sửa] Để tối ưu hóa, khi bạn đã xác định tiền tố duy nhất ngắn nhất của chuỗi, bạn biết rằng nếu có một ký tự khác, thì đó phải là ký tự cuối cùng của tiền tố và bạn đã tìm thấy tiền tố gần như trùng lặp khi kiểm tra một tiền tố ngắn hơn một. Vì vậy, nếu "abcde" có tiền tố duy nhất ngắn nhất "abc", điều đó có nghĩa là có các chuỗi khác bắt đầu bằng "ab?" nhưng không phải với "abc". Tức là nếu họ chỉ khác nhau ở một nhân vật, đó sẽ là nhân vật thứ ba. Bạn không cần phải kiểm tra "abc? E" nữa.
Theo cùng một logic, nếu bạn thấy rằng "cde" là một hậu tố ngắn nhất duy nhất, thì bạn biết rằng bạn chỉ cần kiểm tra tiền tố độ dài 2 "ab" chứ không phải tiền tố dài 1 hoặc 3.
Lưu ý rằng phương pháp này chỉ hoạt động với chính xác một sự khác biệt của một ký tự và không khái quát thành 2 sự khác biệt về ký tự, nó dựa vào một ký tự là sự tách biệt giữa các tiền tố giống hệt nhau và các hậu tố giống hệt nhau.