Rozważ następujące definicje zaczerpnięte z liczby przebiegów w ciągu W. Ryttera. Zauważ, że słowo, ciąg i podciąg są z grubsza synonimami.
Przebieg w ciągu to nieściągalny (z tym samym minimalnym okresem) okresowy odcinek w ciągu.
Okres p słowa w jest dowolną liczbą całkowitą dodatnią p, tak że w [i] = w [i + p], ilekroć zdefiniowane są obie strony tego równania. Niech na (w) oznacza wielkość najmniejszego okresu w. Mówimy, że słowo w jest okresowym iff na (w) <= | w | / 2.
Na przykład rozważ ciąg x = abcab
. per(abcab) = 3
jak x[1] = x[1+3] = a
, x[2]=x[2+3] = b
i nie ma mniejszy okres. Łańcuch nie abcab
jest zatem okresowy. Jednak ciąg abab
jest okresowy zgodnie z (abab) = 2.
Przebieg (lub maksymalna okresowość) w ciągu w to przedział [i ... j] zj> = i, taki że
- w [i ... j] to słowo okresowe z kropką p = na (w [i ... j])
- Jest maksymalny. Formalnie ani w [i-1] = w [i-1 + p], ani w [j + 1] = w [j + 1-p]. Nieoficjalnie przebieg nie może być zawarty w większym przebiegu z tym samym okresem.
Oznacz przez RUNS (w) zestaw przebiegów w.
Przykłady
Cztery przebiegi atattatt
to [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tatt.
Ciąg aabaabaaaacaacac
zawiera następujące 7 przebiegów:
[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = aacaaca.
Twój wynik powinien być listą przebiegów. Każde uruchomienie powinno określać interwał, który reprezentuje, ale nie musi generować samego podłańcucha. Dokładne formatowanie może być dla Ciebie wygodne.
Przykłady używają indeksowania 1, ale zamiast tego możesz swobodnie korzystać z indeksowania 0, jeśli jest to wygodniejsze.
ZADANIE
Napisz kod o podanym łańcuchu w, wypisz RUNS (w).
Języki i wprowadzanie
Możesz użyć dowolnego języka, który ci się podoba, i pobrać ciąg wejściowy w dowolnej dogodnej formie. Musisz jednak podać pełny program i powinieneś pokazać przykład swojego kodu działającego na przykładowym wejściu.
class A{public static ...}
za każdym razem, gdy chciałem grać w golfaOdpowiedzi:
Pyth, 38 bajtów
Zestaw testowy
źródło
[i, j]
reprezentuje początkowy kawałek między (0 indeksowane) znakówi-1
ii
i kończących się między znakamij-1
ij
. Jest to standardowa konwencja w Pyth i najbardziej rozsądnych językach, tak jak powinna (patrz tutaj i tutaj ).CJam, 66
Wypróbuj online
Krótkie wyjaśnienie:
Algorytm działa w 4 krokach (pierwsze 3 z nich odpowiadają 3 głównym blokom, które można zaobserwować):
Chciałbym zagrać w golfa bardziej, więc to wszystko może ulec zmianie.
źródło