Ваш алгоритм неверен . Я предполагаю, что вы знаете, как вычислить массив суффиксов и массив LCP строки, то есть их эффективную реализацию. Как было отмечено в комментариях, вы должны попытаться понять, что представляет собой каждый компонент и почему он работает.
Прежде всего, это массив суффиксов ( ) строки. Суффиксный массив - это в основном все суффиксы строки SSAS расположенные в порядке возрастания лексикографии. Более конкретно, значение указывает, что суффикс S, начиная с позиции S A [ i ] , ранжируется i в лексикографическом порядке всех суффиксов SSA[i]SSA[i]iS .
Далее идет массив L C P [ i ] указывает длину самого длинного общего префикса между суффиксами, начиная с S A [ i - 1 ] и S A [ i ] . То есть он отслеживает длину самого длинного общего префикса среди двух последовательных суффиксов SLCPLCP[i]SA[i−1]SA[i]S когда они расположены в лексикографическом порядке.
В качестве примера рассмотрим строку . Суффиксы в лексикографическом порядке должны быть { a , a b b a b c a , a b c a , b a b c для массива с 1 индексом. Л С РS=abbabca , поэтому S A = [ 7 , 1{a,abbabca,abca,babca,bbabca,bca,ca}.массив будет Ь С Р = [ - , 1 , 2 , 0 , 1 , 1 , 0 ]SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Теперь, учитывая две строки и B , мы объединяем их как S = A # B , где #ABS=A#B# это символ не присутствует в обоих и B . Причина выбора такого символа заключается в том, что при вычислении LCP из двух суффиксов, скажем, a b # dAB и a b dab#dabdа бd , сравнение прервется в конце первой строки (поскольку это происходит только один раз, два разных суффикса никогда не будут иметь его в одной и той же позиции) и не будут «перетекать» в другую строку.
Теперь видно, что вы должны понимать, почему вам нужно видеть только последовательные значения в массиве L C P (аргумент основан на противоречии и том факте, что суффиксы в S A расположены в лексикографическом порядке). Продолжайте проверять L CL CпSAмассив P на максимальное значение, чтобысравниваемые два суффикса не принадлежали к одной и той же исходной строке. Если они не принадлежат одной и той же исходной строке (одна начинается в A, а другая в B ), то наибольшее такое значение - это длина наибольшей общей подстроки.L CпAВ
В качестве примера рассмотрим и B = b c . Тогда S = a b c a b c # b c . Сортированные суффиксы: { a b c # b cA = a b c a b cB=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]
Теперь, наибольшее значение , но это для S A [ 1 ] и S A [ 2 ] , оба из которых начинаются в строке A . Итак, мы игнорируем это. С другой стороны, L C P [ 4 ] = 2 для S A [ 3 ] (соответствует суффиксу b cLCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bc в ) и S A [ 4 ]BSA[4](соответствует суффиксу в A ). Итак, это самая длинная общая подстрока между двумя строками. Для получения фактической подстроки вы берете подстроку длины 2 (значение наибольшей из возможных L C P ), начиная с S A [ 3 ] или S A [ 4 ] , то есть b c .bcabc#bcA2 LCPSA[3]SA[4]bc