Отвечая на мой вопрос:
Учитывая, что длинное совпадение также является коротким совпадением, вы можете обменять несколько проходов на ОЗУ, сначала найдя более короткие совпадения, а затем посмотрев, можно ли «увеличить» эти совпадения.
Буквальный подход к этому состоит в построении трех (с количеством в каждом узле) всех последовательностей некоторой фиксированной длины в данных. Затем вы отбираете все те узлы, которые не соответствуют вашим критериям (например, самое длинное соответствие). Затем выполните последующий проход по данным, построив последовательность глубже, но не шире. Повторяйте, пока не найдете самые длинные повторяющиеся последовательности.
Хороший друг предложил использовать хеширование. Хэшируя последовательность символов фиксированной длины, начинающуюся с каждого символа, вы теперь сталкиваетесь с проблемой поиска дублированных хеш-значений (и проверки дублирования, поскольку хеширование с потерями). Если вы выделите массиву длину данных для хранения значений хеша, вы можете делать интересные вещи, например, чтобы увидеть, больше ли совпадение, чем ваш проход данных фиксированной длины, вы можете просто сравнить последовательности хэшей, а не восстанавливать их. И т.д.