Я предполагаю, что у вас есть один X и один Y для сравнения.Объедините их, разделив их символом маркера, который не отображается ни в одной из них, например, XoY.Теперь сформируйте http://en.wikipedia.org/wiki/Suffix_array в линейном времени.
Получите массив указателей на позиции в объединенной строке, где указатели расположены так, что подстроки, на которые они указывают, отображаются в алфавитном порядке.в массиве.Вы также получаете массив LCP, дающий длину самого длинного общего префикса, совместно используемого суффиксом и суффиксом непосредственно перед ним в массиве, который является суффиксом, который сортирует чуть меньше его.На самом деле это самый длинный общий префикс, который разделяется между этой позицией и ЛЮБОЙ подстрокой меньше ее, потому что все, что имеет более длинный общий префикс и меньше чем строка [i], будет сортировать между ним и текущей строкой [i - 1].
Вы можете сказать, на какую исходную строку указывает указатель со своей позиции, потому что X предшествует Y. Вы можете разрезать массив на чередующиеся подразделы указателей X и Y.Длина общего префикса, общего для pos [i] и pos [i - 1], равна lcp [i].Длина префикса, общего для pos [i] и pos [i-2], равна min (lcp [i], lcp [i-1]).Так что, если вы начнете со значения Y непосредственно перед диапазоном X, вы можете определить количество символов префикса между этим Y и всеми X по очереди, уменьшая секцию, выполняя операцию min на каждом шаге.Точно так же вы можете определить количество символов префикса, совместно используемых всеми этими символами X и Y, которые появляются следующим в массиве суффиксов, по цене одной минуты на X. То же самое, конечно, для диапазонов Y.Теперь сделайте максимум для каждой записи, чтобы определить самый длинный префикс, общий для каждой позиции в X (или Y) и любой позиции в Y (или X).
Я думаю, вы хотите, чтобы подстроки в X или Y былииметь небольшие префиксы, разделяемые между ним и любой другой подстрокой другого пола, потому что строки на один символ длиннее, чем этот, начиная с той же позиции, вообще не появляются в другом поле.Я думаю, что как только вы выполнили вычисления min () выше, вы можете извлечь N наименьших подстрок префикса, используя кучу для отслеживания N наименьших записей.Я думаю, что все здесь занимает время, линейное в | X |+ | Y |(если только N не сопоставимо с | X | или | Y |).