Tu algoritmo es incorrecto . Supongo que sabe cómo calcular la matriz de sufijos y la matriz LCP de una cadena, es decir, su implementación eficiente. Como se ha señalado en los comentarios, debe intentar comprender qué es cada componente y por qué funciona.
En primer lugar, es la matriz de sufijos ( ) de una cadena. Una matriz de sufijos es básicamente todos los sufijos de la cadena S dispuestos en orden lexicográfico ascendente. Más específicamente, el valor S A [ i ] indica que el sufijo de S a partir de la posición S A [ i ] está clasificado como iSASSA[i]SSA[i]i en el orden lexicográfico de todos los sufijos de .S
Lo siguiente es la matriz L C P [ i ] indica la longitud del prefijo común más largo entre los sufijos que comienzan desde S A [ i - 1 ] y S A [ i ] . Es decir, realiza un seguimiento de la longitud del prefijo común más largo entre dos sufijos consecutivos de S cuando se disponen en orden lexicográfico.LCPLCP[i]SA[i−1]SA[i]S
Como ejemplo, considere la cadena . Los sufijos en orden lexicográfico serían { 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 } , entonces S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} para una matriz indexada 1. Lamatriz L C P sería L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ] .SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Ahora, dado dos cadenas y B , que les concatenar como S = A # B , donde # es un personaje no está presente tanto en A y B . La razón para elegir dicho carácter es para que al calcular el LCP de dos sufijos, diga a b # d a b d y a bABS=A#B#ABab#dabd , la comparación se interrumpa al final de la primera cadena (ya que solo ocurre una vez, dos sufijos diferentes nunca lo tendrán en la misma posición) y no se"desbordarán"en la otra cadena.abd
Ahora, se puede ver que debería poder ver por qué solo necesita ver valores consecutivos en la matriz (el argumento se basa en la contradicción y el hecho de que los sufijos en S A están en orden lexicográfico). Siga revisando la matriz L C P para ver el valor máximo de manera que los dos sufijos que se comparan no pertenezcan a la misma cadena original. Si no pertenecen a la misma cadena original (una comienza en A y la otra en B ), entonces el valor más grande es la longitud de la subcadena común más grande.LCPSALCPAB
Como ejemplo, considere y B = b c . Entonces, S = a b c a b c # b c . Los sufijos ordenados son { 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]
LCP[2]=3SA[1]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]bcabc#bcA2 LCPSA[3] or SA[4], which is bc.