Considera le seguenti definizioni tratte da Il numero di esecuzioni in una stringa di W. Rytter. Nota che parola, stringa e sottostringa sono approssimativamente sinonimi.
Un'esecuzione in una stringa è un segmento periodico non allungabile (con lo stesso periodo minimo) in una stringa.
Un punto p di una parola w è un numero intero positivo p tale che w [i] = w [i + p] ogni volta che vengono definiti entrambi i lati di questa equazione. Let per (w) indica la dimensione del periodo più piccolo di w. Diciamo che una parola w è periodica iff per (w) <= | w | / 2.
Ad esempio, considera la stringa x = abcab
. per(abcab) = 3
come x[1] = x[1+3] = a
, x[2]=x[2+3] = b
e non v'è alcun periodo più piccolo. La stringa non abcab
è pertanto periodica. Tuttavia, la stringa abab
è periodica secondo (abab) = 2.
Una corsa (o massima periodicità) in una stringa w è un intervallo [i ... j] con j> = i, tale che
- w [i ... j] è una parola periodica con il periodo p = per (w [i ... j])
- È massimo. Formalmente, né w [i-1] = w [i-1 + p] né w [j + 1] = w [j + 1-p]. Informalmente, la corsa non può essere contenuta in una corsa più grande con lo stesso periodo.
Indicare con RUNS (w) il set di percorsi di w.
Esempi
Le quattro serie di atattatt
sono [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt.
La stringa aabaabaaaacaacac
contiene le seguenti 7 esecuzioni:
[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = aacaaca.
L'output dovrebbe essere un elenco di esecuzioni. Ogni esecuzione deve specificare l'intervallo che rappresenta ma non è necessario generare la sottostringa stessa. La formattazione esatta può essere ciò che è conveniente per te.
Gli esempi usano l'indicizzazione 1 ma sei libero di usare l'indicizzazione 0 invece se è più conveniente.
COMPITO
Scrivi il codice che ha dato una stringa w, output RUNS (w).
Lingue e input
Puoi usare qualsiasi lingua ti piaccia e prendere la stringa di input in qualunque forma sia più conveniente. Devi comunque fornire un programma completo e dovresti mostrare un esempio del tuo codice in esecuzione sull'input di esempio.
class A{public static ...}
ogni volta che volevo giocare a golf