Ваш алгоритм невірний . Я припускаю, що ви знаєте, як обчислити суфіксний масив та LCP масив рядка, тобто їх ефективну реалізацію. Як було зазначено в коментарях, ви повинні спробувати зрозуміти, що таке кожен компонент, і чому він працює.
Перш за все, це суфіксний масив ( ) рядка. Суфіксний масив - це в основному всі суфікси рядка S, розташовані у порядку зростання лексикографічного порядку. Більш конкретно, значення S A [ i ] вказує на те, що суфікс S, що починається з позиції S A [ i ] , класифікується iSASSA[i]SSA[i]i в лексикографічному упорядкуванні всіх суфіксів .S
Далі - масив L C P [ i ] позначає довжину найдовшого загального префікса між суфіксами, починаючи з S A [ i - 1 ] та S A [ i ] . Тобто він відслідковує довжину найдовшого загального префікса серед двох послідовних суфіксів S, якщо вони розташовані в лексикографічному порядку.LCPLCP[i]SA[i−1]SA[i]S
Як приклад, розглянемо рядок . Суфікси в лексикографічному порядку були б { 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 } , так S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} для 1-індексованого масиву. Л С Р масив буде Ь С Р = [ - , 1 , 2 , 0 , 1 , 1 ,SA=[7,1,4,3,2,5,6]LCP .LCP=[−,1,2,0,1,1,0]
Тепер, з огляду на два рядки і B , ми зчепити їх , як S = A # B , де # це символ не присутній в обох A і B . Причина вибору такого символу полягає в тому, що при обчисленні LCP двох суфіксів скажіть a b # d a b d і a bABS=A#B#ABab#dabd , порівняння розривається в кінці першого рядка (оскільки воно відбувається лише один раз, два різні суфікси ніколи не матимуть його в одному положенні) і не будуть"переповнюватися"в інший рядок.abd
Тепер видно, що ви повинні мати можливість бачити, чому вам потрібно бачити лише послідовні значення в масиві (аргумент заснований на суперечності та тому, що суфікси в S A знаходяться в лексикографічному порядку). Продовжуйте перевіряти масив L C P на максимальне значення таким чином, щоб два суфікси, що порівнюються, не належали до однієї оригінальної рядки. Якщо вони не належать до однієї і тієї самої початкової рядки (одна починається з A, а друга в B ), то найбільшим таким значенням є довжина найбільшої загальної підрядки.LCPSALCPAB
Як приклад, розглянемо і B = b c . Тоді S = a b c a b c # b c . Відсортовані суфікси { 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 . S A{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]
LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4]bcabc#bcA2 LCPSA[3]SA[4]bc