[Questa domanda è un seguito per calcolare le esecuzioni di una stringa ]
Un periodo
pdi una stringawè un numero intero positivoptale chew[i]=w[i+p]ogni volta che vengono definiti entrambi i lati di questa equazione. Lasciate cheper(w)denotano la dimensione del più piccolo periodo diw. Diciamo che una stringawè periodica iffper(w) <= |w|/2.
Quindi informalmente una stringa periodica è solo una stringa composta da un'altra stringa ripetuta almeno una volta. L'unica complicazione è che alla fine della stringa non è necessaria una copia completa della stringa ripetuta purché sia ripetuta nella sua interezza almeno una volta.
Ad esempio, considera la stringa x = abcab. per(abcab) = 3come x[1] = x[1+3] = a, x[2]=x[2+3] = be non v'è alcun periodo più piccolo. La stringa non abcabè pertanto periodica. Tuttavia, la stringa ababaè periodica come per(ababa) = 2.
Come altri esempi, abcabca, ababababae abcabcabcsono anche periodiche.
Per coloro a cui piacciono le regex, questa individua se una stringa è periodica o meno:
\b(\w*)(\w+\1)\2+\b
Il compito è trovare tutte le sottostringhe periodiche massime in una stringa più lunga. Questi sono a volte chiamati piste in letteratura.
Una stringa
wè una stringa periodica massimale (run) se è periodica e 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.
Poiché due sequenze possono rappresentare la stessa stringa di caratteri che si verificano in punti diversi nella stringa complessiva, rappresenteremo le sequenze per intervalli. Ecco la definizione sopra ripetuta in termini di intervalli.
Una corsa (o sottostringa periodica massima) in una stringa
Tè un intervallo[i...j]conj>=itale che
T[i...j]è una parola periodica con il puntop = per(T[i...j])- È massimo. Formalmente, né
T[i-1] = T[i-1+p]néT[j+1] = T[j+1-p]. Informalmente, la corsa non può essere contenuta in una corsa più grande con lo stesso periodo.
Indicare dal RUNS(T)set di esecuzioni nella stringa T.
Esempi di piste
I quattro sottostringhe periodiche massimi (corse) nella stringa
T = atattattsonoT[4,5] = tt,T[7,8] = tt,T[1,4] = atat,T[2,8] = tattatt.La stringa
T = aabaabaaaacaacaccontiene i seguenti 7 sottostringhe periodiche massimi (corse):T[1,2] = aa,T[4,5] = aa,T[7,10] = aaaa,T[12,13] = aa,T[13,16] = acac,T[1,8] = aabaabaa,T[9,15] = aacaaca.La stringa
T = atatbatatbcontiene le seguenti tre esecuzioni. Essi sono:T[1, 4] = atat,T[6, 9] = atateT[1, 10] = atatbatatb.
Qui sto usando 1-indicizzazione.
L'obiettivo
Scrivi il codice in modo che per ogni numero intero a partire da 2, produca il maggior numero di esecuzioni contenute in qualsiasi stringa binaria di lunghezza n.
Punto
Il tuo punteggio è il più alto nche raggiungi in 120 secondi in modo tale che per tutti k <= n, nessun altro ha pubblicato una risposta corretta più alta di te. Chiaramente se hai tutte le risposte ottimali otterrai il punteggio per il punteggio più alto nche pubblichi . Tuttavia, anche se la tua risposta non è ottimale, puoi comunque ottenere il punteggio se nessun altro può batterlo.
Lingue e biblioteche
È possibile utilizzare qualsiasi lingua e libreria disponibili. Laddove possibile, sarebbe bene poter eseguire il codice, quindi includere una spiegazione completa su come eseguire / compilare il codice in Linux, se possibile.
Esempio optima
In quanto segue: n, optimum number of runs, example string.
2 1 00
3 1 000
4 2 0011
5 2 00011
6 3 001001
7 4 0010011
8 5 00110011
9 5 000110011
10 6 0010011001
11 7 00100110011
12 8 001001100100
13 8 0001001100100
14 10 00100110010011
15 10 000100110010011
16 11 0010011001001100
17 12 00100101101001011
18 13 001001100100110011
19 14 0010011001001100100
20 15 00101001011010010100
21 15 000101001011010010100
22 16 0010010100101101001011
Cosa dovrebbe esattamente produrre il mio codice?
Per ognuno il ntuo codice dovrebbe generare una singola stringa e il numero di esecuzioni che contiene.
La mia macchina I tempi verranno eseguiti sulla mia macchina. Questa è un'installazione ubuntu standard su un processore a otto core AMD FX-8350. Questo significa anche che devo essere in grado di eseguire il tuo codice.
Risposte principali
- 49 da Anders Kaseorg in C . A thread singolo ed eseguito con L = 12 (2 GB di RAM).
- 27 da cdlane in C .
{0,1}-strings, ti preghiamo di dichiararlo esplicitamente. Altrimenti l'alfabeto potrebbe essere infinito e non vedo perché i tuoi test dovrebbero essere ottimali, perché sembra che tu abbia cercato {0,1}anche solo le stringhe.
nfino a 12e non ha mai battuto l'alfabeto binario. Dal punto di vista euristico, mi aspetto che una stringa binaria sia ottimale, poiché l'aggiunta di più caratteri aumenta la lunghezza minima di una corsa.
