하나의 문자가 다른 길이 k 의 두 문자열은 길이 l 의 접두사 와 길이 m 의 접미사를 공유 합니다. K = L + m + 1 .
사이먼 프린스에 의해 대답은 모두 / 접미사 조합이 명시 적으로, 즉 접두사 저장하여이 인코딩 abc
되고 *bc
,a*c
하고 ab*
. k = 3, l = 0,1,2, m = 2,1,0입니다.
valarMorghulis가 지적한 것처럼 접두사 트리에서 단어를 구성 할 수 있습니다. 매우 유사한 접미사 트리도 있습니다. 각 접두사 또는 접미사 아래에 리프 노드 수를 사용하여 트리를 확장하는 것은 매우 쉽습니다. 새 단어를 삽입 할 때 O (k)로 업데이트 할 수 있습니다.
이 형제 수를 원하는 이유는 동일한 접두사로 모든 문자열을 열거할지 또는 동일한 접미사로 모든 문자열을 열거할지 여부를 새로운 단어로 알 수 있기 때문입니다. 예를 들어 "abc"를 입력으로 사용할 경우 접두어는 "", "a"및 "ab"이며 해당 접미사는 "bc", "c"및 ""입니다. 명백하게, 짧은 접미어의 경우 접두사 트리에서 형제를 열거하고 그 반대의 경우도 더 좋습니다.
@einpoklum이 지적했듯이 모든 문자열이 동일한 k / 2 접두사를 공유 할 수 있습니다 . 이 방법에는 문제가되지 않습니다. 접두사 트리는 최대 k / 2 깊이까지 100.000 리프 노드의 조상으로 깊이 k / 2까지 선형입니다. 결과적으로 접미사 트리는 최대 (k / 2-1) 깊이까지 사용됩니다. 접두사를 공유하면 문자열의 접미사가 달라야하기 때문에 좋습니다.
당신은 문자열의 짧은 고유의 접두사를 결정하고 나면 최적화로 [편집], 당신이 알고 있는 경우 때 거의 중복 한 다른 문자가있다, 그것은 접두사의 마지막 문자 여야합니다, 당신은 발견 한 것 하나 더 짧은 접두사를 확인합니다. 따라서 "abcde"에 가장 짧은 고유 접두사 "abc"가 있으면 "ab?"로 시작하는 다른 문자열이 있음을 의미합니다. "abc"는 아닙니다. 즉, 한 문자 만 다르면 세 번째 문자가됩니다. 더 이상 "abc? e"를 확인할 필요가 없습니다.
같은 논리로 "cde"가 가장 짧은 고유 접미사 인 경우 길이 1 또는 3 접두사가 아닌 길이 -2 "ab"접두사 만 확인하면된다는 것을 알고 있습니다.
이 방법은 정확히 하나의 문자 차이에 대해서만 작동하며 2 개의 문자 차이로 일반화되지 않으며 동일한 접두사와 동일한 접미사로 구분되는 한 문자를 사용합니다.