[Esta pergunta é um acompanhamento para calcular as execuções de uma string ]
Um período
p
de uma stringw
é qualquer número inteiro positivo, dep
modo que,w[i]=w[i+p]
sempre que ambos os lados desta equação forem definidos. Vamosper(w)
denotar o tamanho do menor período dew
. Dizemos que uma stringw
é periódica seper(w) <= |w|/2
.
Tão informalmente, uma sequência periódica é apenas uma sequência composta de outra sequência repetida pelo menos uma vez. A única complicação é que, no final da sequência, não exigimos uma cópia completa da sequência repetida, desde que seja repetida na íntegra pelo menos uma vez.
Por exemplo, considere a sequência x = abcab
. per(abcab) = 3
como x[1] = x[1+3] = a
, x[2]=x[2+3] = b
e não há período menor. A sequência abcab
não é, portanto, periódica. No entanto, a cadeia ababa
é periódica como per(ababa) = 2
.
Como outros exemplos, abcabca
, ababababa
e abcabcabc
também são periódicas.
Para quem gosta de expressões regulares, este detecta se uma sequência é periódica ou não:
\b(\w*)(\w+\1)\2+\b
A tarefa é encontrar todas as substrings periódicas máximas em uma sequência mais longa. Essas são algumas vezes chamadas de execuções na literatura.
Uma substring
w
é uma substring periódica máxima (execução) se for periódica e não forw[i-1] = w[i-1+p]
nemw[j+1] = w[j+1-p]
. Informalmente, a "execução" não pode estar contida em uma "execução" maior com o mesmo período.
Como duas execuções podem representar a mesma sequência de caracteres que ocorre em locais diferentes na sequência geral, representaremos as execuções por intervalos. Aqui está a definição acima repetida em termos de intervalos.
Uma execução (ou substring periódica máxima) em uma string
T
é um intervalo[i...j]
comj>=i
, de modo que
T[i...j]
é uma palavra periódica com o períodop = per(T[i...j])
- É o máximo. Formalmente, nem
T[i-1] = T[i-1+p]
nemT[j+1] = T[j+1-p]
. Informalmente, a execução não pode estar contida em uma execução maior com o mesmo período.
Indique pelo RUNS(T)
conjunto de execuções na cadeia de caracteres T
.
Exemplos de execuções
Os quatro substrings periódicas máximas (runs) em corda
T = atattatt
sãoT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.A cadeia de caracteres
T = aabaabaaaacaacac
contém os seguintes máximos 7 subsequências periódicos (separações):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
.A sequência
T = atatbatatb
contém as três execuções a seguir. Eles são:T[1, 4] = atat
,T[6, 9] = atat
eT[1, 10] = atatbatatb
.
Aqui estou usando a indexação 1.
A tarefa
Escreva o código para que, para cada número inteiro n começando em 2, você produza o maior número de execuções contidas em qualquer cadeia de comprimento binária n
.
Ponto
Sua pontuação é a mais alta que n
você alcança em 120 segundos, de modo que, para todos k <= n
, ninguém postou uma resposta correta mais alta que você. Claramente, se você tiver todas as respostas ideais, obterá a pontuação mais alta n
que postar. No entanto, mesmo que sua resposta não seja a ideal, você ainda pode obter a pontuação se ninguém mais conseguir vencê-la.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis que desejar. Onde for possível, seria bom poder executar seu código; portanto, inclua uma explicação completa de como executar / compilar seu código no Linux, se possível.
Exemplo optima
No seguinte: 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
O que exatamente meu código deve produzir?
Para cada um, n
seu código deve gerar uma única string e o número de execuções que ele contém.
Minha máquina Os horários serão executados na minha máquina. Esta é uma instalação padrão do ubuntu em um processador AMD FX-8350 de oito núcleos. Isso também significa que eu preciso poder executar seu código.
Respostas principais
- 49 por Anders Kaseorg em C . Thread único e executado com L = 12 (2 GB de RAM).
- 27 por cdlane em C .
{0,1}
-strings, indique explicitamente isso. Caso contrário, o alfabeto pode ser infinito, e não vejo por que seus casos de teste devem ser ótimos, porque parece que você {0,1}
também pesquisou as strings também.
n
até 12
e nunca bater o alfabeto binário. Heuristicamente, eu esperaria que uma string binária fosse ótima, porque adicionar mais caracteres aumenta o comprimento mínimo de uma execução.