Algoritme Anda salah . Saya berasumsi Anda tahu bagaimana menghitung array suffix dan array LCP dari sebuah string, yaitu implementasi yang efisien. Seperti yang telah ditunjukkan dalam komentar, Anda harus mencoba memahami apa yang masing-masing komponen, dan mengapa itu bekerja.
Pertama-tama, adalah array suffix ( ) dari sebuah string. Susunan sufiks pada dasarnya adalah semua sufiks dari string S yang disusun dalam urutan leksikografis naik. Lebih khusus, nilai S A [ i ] menunjukkan bahwa akhiran dari S mulai dari posisi S A [ i ] adalah peringkat saya dalam pemesanan leksikografis semua akhiran dari S .SASSA[i]SSA[i]iS
Berikutnya adalah array L C P [ i ] menunjukkan panjang awalan umum terpanjang antara sufiks mulai dari S A [ i - 1 ] dan S A [ i ] . Yaitu, ia melacak panjang awalan umum terpanjang di antara dua sufiks S berturut-turut ketika disusun dalam urutan leksikografis.LCPLCP[i]SA[i−1]SA[i]S
Sebagai contoh, perhatikan string . Sufiks dalam susunan leksikografis adalah { a , a b b a b c a , a b c a , b a b c a , b b a b c a , b c a , c a } , jadi S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} untuk array 1-diindeks. The L C P array yang akan L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ] .SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Sekarang, diberikan dua string dan B , kita menggabungkan mereka sebagai S = A # B , di mana # adalah karakter tidak hadir di kedua A dan B . Alasan untuk memilih karakter seperti itu adalah bahwa ketika menghitung LCP dari dua sufiks, katakan a b # d a b d dan a b d , perbandingan akan terputus pada akhir string pertama (karena hanya terjadi sekali, dua sufiks yang berbeda tidak akan pernah berada di posisi yang sama), dan tidak akan "meluap" ke string lain.ABS=A#B#ABab#dabdabd
Sekarang, dapat dilihat bahwa Anda harus dapat melihat mengapa Anda hanya perlu melihat nilai-nilai berturut-turut dalam array (argumen didasarkan pada kontradiksi dan fakta bahwa sufiks dalam S A berada dalam urutan leksikografis). Terus periksa array L C P untuk nilai maksimum sehingga dua sufiks yang dibandingkan tidak menjadi milik string asli yang sama. Jika mereka tidak termasuk string asli yang sama (satu dimulai pada A dan yang lain dalam B ), maka nilai terbesar adalah panjang substring umum terbesar.LCPSALCPAB
Sebagai contoh, pertimbangkan dan B = b c . Kemudian, S = a b c a b c # b c . Sufiks yang diurutkan adalah { a b c # b c , a b c a b c # b c , b c , b c # b c , b c aA=abcabcB=bcS=abcabc#bc{abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc#bc}.
SALCP=[4,1,8,5,2,9,6,3,7]=[−,3,0,2,2,0,1,1,0]
Now, the greatest value is LCP[2]=3, but it is for SA[1] and SA[2], both of which start in the string A. So, we ignore that. On the other hand, LCP[4]=2 is for SA[3] (corresponds to the suffix bc of B) and SA[4] (corresponding to suffix bcabc#bc of A). So, this is the longest common substring between the two strings. For getting the actual substring, you take a length 2 (value of the greatest feasible LCP) substring starting from either SA[3] or SA[4], which is bc.