Начальная строка S длиной Len.Удвойте строку (на самом деле нам нужно S + половина S).Поиск вхождения начальной строки S в удвоенной строке SS, начиная со 2-й позиции, заканчивающейся в Len / 2 + 1. Если такое вхождение существует с позицией P, то S является периодическим с периодом P - 1.
S= abbaabbaabba Len = 12 SS = abbaabbaabbaabbaabbaabba
Поиск со 2-й по 7-ю позицию, S найден на P = 5, период = 4
S = abaabaabaabb SS = abaabaabaabbabaabaabaabb
Sне возникает в SS (кроме 1 и L + 1), период не существует
PS Примечание из-за полезного комментария Venkatesh: нам нужно добавить минимально возможную периодическую единицу, ее длинуL / 2 для строк четного размера и максимальный делитель L для строк нечетного размера (если длина является простым числом, строка не может быть периодической).Простые методы факторизации имеют сложность O (N ^ 1/2), более сложные - O (N ^ 1/4), поэтому иногда стоит факторизовать длину, чтобы избежать ненужного сравнения длинных строк.