[Questa domanda è un seguito per calcolare le esecuzioni di una stringa ]
Un periodo
p
di una stringaw
è un numero intero positivop
tale 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) = 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 ababa
è periodica come per(ababa) = 2
.
Come altri esempi, abcabca
, ababababa
e abcabcabc
sono 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>=i
tale 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 = atattatt
sonoT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.La stringa
T = aabaabaaaacaacac
contiene 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 = atatbatatb
contiene le seguenti tre esecuzioni. Essi sono:T[1, 4] = atat
,T[6, 9] = atat
eT[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 n
che 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 n
che 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 n
tuo 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.
n
fino a 12
e 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.