[Esta pergunta é um acompanhamento para calcular as execuções de uma string ]
Um período
pde uma stringwé qualquer número inteiro positivo, depmodo 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) = 3como x[1] = x[1+3] = a, x[2]=x[2+3] = be não há período menor. A sequência abcabnão é, portanto, periódica. No entanto, a cadeia ababaé periódica como per(ababa) = 2.
Como outros exemplos, abcabca, ababababae abcabcabctambé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 = atattattsãoT[4,5] = tt,T[7,8] = tt,T[1,4] = atat,T[2,8] = tattatt.A cadeia de caracteres
T = aabaabaaaacaacacconté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 = atatbatatbcontém as três execuções a seguir. Eles são:T[1, 4] = atat,T[6, 9] = atateT[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 nvocê 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 nque 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, nseu 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.
naté 12e 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.
