Dua string panjang k , berbeda dalam satu karakter, berbagi awalan panjang l dan akhiran panjang m sedemikian sehingga k = l + m + 1 .
Jawaban oleh Simon Prins mengkodekan ini dengan menyimpan semua kombinasi awalan / akhiran secara eksplisit, yaitu abc
menjadi *bc
, a*c
dan ab*
. Itu k = 3, l = 0,1,2 dan m = 2,1,0.
Seperti yang ditunjukkan valarMorghulis, Anda dapat mengatur kata-kata di pohon awalan. Ada juga pohon sufiks yang sangat mirip. Cukup mudah untuk menambah pohon dengan jumlah simpul daun di bawah setiap awalan atau akhiran; ini dapat diperbarui dalam O (k) saat memasukkan kata baru.
Alasan Anda menginginkan jumlah saudara ini adalah agar Anda tahu, diberi kata baru, apakah Anda ingin menghitung semua string dengan awalan yang sama atau apakah untuk menghitung semua string dengan akhiran yang sama. Misalnya untuk "abc" sebagai input, awalan yang mungkin adalah "", "a" dan "ab", sedangkan sufiks yang sesuai adalah "bc", "c" dan "". Seperti sudah jelas, untuk sufiks pendek, lebih baik untuk menyebutkan saudara kandung di pohon awalan dan sebaliknya.
Seperti yang ditunjukkan oleh @einpoklum, tentu saja semua string memiliki awalan k / 2 yang sama . Itu bukan masalah untuk pendekatan ini; pohon awalan akan linier hingga kedalaman k / 2 dengan setiap node hingga kedalaman k / 2 adalah nenek moyang 100.000 simpul daun. Akibatnya, pohon sufiks akan digunakan hingga kedalaman (k / 2-1), yang baik karena string harus berbeda dalam sufiksnya mengingat mereka berbagi awalan.
[sunting] Sebagai pengoptimalan, setelah Anda menentukan awalan unik terpendek dari sebuah string, Anda tahu bahwa jika ada satu karakter yang berbeda, itu harus menjadi karakter terakhir dari awalan, dan Anda akan menemukan duplikat terdekat saat memeriksa awalan yang lebih pendek. Jadi jika "abcde" memiliki awalan unik terpendek "abc", itu berarti ada string lain yang dimulai dengan "ab?" tetapi tidak dengan "abc". Jika mereka berbeda hanya dalam satu karakter, itu adalah karakter ketiga. Anda tidak perlu memeriksa "abc? E" lagi.
Dengan logika yang sama, jika Anda akan menemukan bahwa "cde" adalah sufiks terpendek yang unik, maka Anda tahu bahwa Anda perlu memeriksa hanya awalan panjang-2 "ab" dan bukan awalan panjang 1 atau 3.
Perhatikan bahwa metode ini hanya bekerja untuk satu perbedaan karakter dan tidak menggeneralisasi ke 2 perbedaan karakter, itu bergantung pada satu karakter sebagai pemisahan antara awalan yang identik dan akhiran yang identik.