Розглянемо наступні визначення, взяті з Кількість прогонів у рядку В. Райттера. Зауважте, що слово, рядок та підрядка - це приблизно синоніми.
Запуск у рядку - це нерозширюваний (з однаковим мінімальним періодом) періодичний сегмент у рядку.
Період p слова w - це будь-яке додатне ціле p, таке, що w [i] = w [i + p], коли визначаються обидві сторони цього рівняння. Нехай per (w) позначає розмір найменшого періоду w. Ми говоримо, що слово w - періодичне iff per (w) <= | w | / 2.
Для прикладу розглянемо рядок x = abcab
. per(abcab) = 3
як x[1] = x[1+3] = a
, x[2]=x[2+3] = b
і менший період не існує. Тому рядок не abcab
є періодичним. Однак рядок abab
є періодичним відповідно до (abab) = 2.
Пробіг (або максимальна періодичність) у рядку w - це інтервал [i ... j] з j> = i, такий, що
- w [i ... j] - періодичне слово з періодом p = per (w [i ... j])
- Це максимально. Формально ні w [i-1] = w [i-1 + p], ні w [j + 1] = w [j + 1-p]. Неофіційно запуск не може міститись у більшому циклі з тим самим періодом.
Позначимо через RUNS (w) набір прогонів w.
Приклади
Чотири прогони atattatt
становлять [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = таттатт.
Рядок aabaabaaaacaacac
містить наступні 7 запусків:
[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = акаака.
Вашим результатом повинен бути список запусків. Кожен запуск повинен визначати інтервал, який він представляє, але не потрібно виводити саму підрядку. Точне форматування може бути будь-яким зручним для вас.
У прикладах використовується 1-індексація, але ви можете використовувати натомість 0-індексацію, якщо це зручніше.
ЗАВДАННЯ
Напишіть код, який задав рядок w, виведіть RUNS (w).
Мови та введення
Ви можете використовувати будь-яку мову, яка вам подобається, і приймати рядок введення в будь-якій формі, яка є найбільш зручною. Ви повинні надати повну програму, і вам слід показати приклад вашого коду, який працює на прикладі входу.
class A{public static ...}
кожен раз, коли я хотів гольф-код