Для нескольких строк подойдет другой метод: давайте склеим наши строки A, B, C в одну строку, разделив их разными символами-разделителями: например, A#B@C$. Построим по полученной строке суффиксный автомат. Для каждого состояния этого автомата определим, в каких строках оно встречается. Например, состояние встречается в строке A, если из этого состояния достижим переход по символу #. Аналогично, состояние встречается в строке B, если из него по переходам достижим переход по символу @ (но при условии, что при проверке достижимости мы не переходим по символу #). Аналогично, состояние встречается в строке C, если из него достижим переход по символу $ (при этом мы аналогично игнорируем переходы по символа # и @).
Посчитав теперь эти достижимости (что можно делать за линейное время - с помощью динамического программирования с меморизацией или оформив это в виде обхода в глубину), мы просто выбираем в качестве ответа такое состояние, которое лежит во всех трёх строках, и при этом имеет наибольшую длину length. (Чтобы вывести саму искомую подстроку, а не только её длину, вместе с каждым состоянием автомата надо будет хранить позицию endpos - она упоминается в статье.)