Рассмотрим следующие определения, взятые из «Количество прогонов в строке » У. Риттера. Обратите внимание, что слово, строка и подстрока являются примерно синонимами.
Прогон в строке - это нерасширяемый (с тем же минимальным периодом) периодический сегмент в строке.
Период p слова w - это любое положительное целое число p, такое что w [i] = w [i + p] всякий раз, когда определены обе стороны этого уравнения. Пусть per (w) обозначает размер наименьшего периода w. Мы говорим, что слово w периодично тогда и только тогда, когда 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] = tattatt.
Строка 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 ...}
каждый раз, когда я хотел написать код для гольфаОтветы:
Pyth, 38 байт
Тестирование
источник
[i, j]
представляет собой срез начиная между (0-индексированных) символовi-1
иi
и заканчивая между символамиj-1
иj
. Это стандартное соглашение в Pyth и большинстве вменяемых языков, как и должно быть (см. Здесь и здесь ).CJam, 66
Попробуйте онлайн
Краткое объяснение:
Алгоритм работает в 4 этапа (первые 3 из них соответствуют 3 основным блокам, которые вы можете наблюдать):
Я бы больше хотел сыграть в гольф, так что все это может измениться.
источник