[Cette question est un suivi pour calculer les exécutions d'une chaîne ]
Une période
p
d'une chaînew
est un entier positifp
tel quew[i]=w[i+p]
chaque fois que les deux côtés de cette équation sont définis. Soitper(w)
la taille de la plus petite période dew
. On dit qu'une chaînew
est périodique ssiper(w) <= |w|/2
.
Donc, officieusement, une chaîne périodique n'est qu'une chaîne composée d'une autre chaîne répétée au moins une fois. La seule complication est qu'à la fin de la chaîne, nous n'avons pas besoin d'une copie complète de la chaîne répétée tant qu'elle est répétée dans son intégralité au moins une fois.
Par exemple, considérez la chaîne x = abcab
. per(abcab) = 3
comme x[1] = x[1+3] = a
, x[2]=x[2+3] = b
et il n'y a pas de période plus courte. La chaîne abcab
n'est donc pas périodique. Cependant, la chaîne ababa
est périodique comme per(ababa) = 2
.
Comme plus d' exemples, abcabca
, ababababa
et abcabcabc
sont également périodiques.
Pour ceux qui aiment les regex, celui-ci détecte si une chaîne est périodique ou non:
\b(\w*)(\w+\1)\2+\b
La tâche consiste à trouver toutes les sous- chaînes périodiques maximales dans une chaîne plus longue. Celles-ci sont parfois appelées « runs» dans la littérature.
Une sous
w
- chaîne est une sous-chaîne périodique maximale (run) si elle est périodique et niw[i-1] = w[i-1+p]
ni niw[j+1] = w[j+1-p]
. De manière informelle, le «run» ne peut pas être contenu dans un «run» plus grand avec la même période.
Étant donné que deux exécutions peuvent représenter la même chaîne de caractères se trouvant à différents endroits de la chaîne globale, nous représenterons les exécutions par intervalles. Voici la définition ci-dessus répétée en termes d'intervalles.
Une exécution (ou sous-chaîne périodique maximale) dans une chaîne
T
est un intervalle[i...j]
avecj>=i
, tel que
T[i...j]
est un mot périodique avec la périodep = per(T[i...j])
- C'est maximal. Formellement, ni
T[i-1] = T[i-1+p]
niT[j+1] = T[j+1-p]
. De manière informelle, l'exécution ne peut pas être contenue dans une exécution plus grande avec la même période.
Indique RUNS(T)
l'ensemble des exécutions en chaîne T
.
Exemples de runs
Les quatre sous - chaînes périodiques maximale (runs) en chaîne
T = atattatt
sontT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.La chaîne
T = aabaabaaaacaacac
contient les 7 sous - chaînes périodiques maximales suivantes (runs):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 chaîne
T = atatbatatb
contient les trois exécutions suivantes. Ils sont:T[1, 4] = atat
,T[6, 9] = atat
etT[1, 10] = atatbatatb
.
Ici, j'utilise l'indexation 1.
La tâche
Écrivez le code de sorte que pour chaque entier n commençant à 2, vous produisiez le plus grand nombre d'exécutions contenues dans n'importe quelle chaîne binaire de longueur n
.
But
Votre score est le plus élevé que n
vous atteignez en 120 secondes de sorte que pour tous k <= n
, personne d'autre n'a posté une réponse correcte plus élevée que vous. De toute évidence, si vous avez toutes les réponses optimales, vous obtiendrez le score le plus élevé que n
vous publiez. Cependant, même si votre réponse n'est pas optimale, vous pouvez toujours obtenir le score si personne d'autre ne peut le battre.
Langues et bibliothèques
Vous pouvez utiliser toutes les langues et bibliothèques disponibles que vous aimez. Dans la mesure du possible, il serait bon de pouvoir exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible.
Exemple optima
Dans ce qui suit: 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
Que doit exactement sortir mon code?
Pour chacun, n
votre code doit sortir une seule chaîne et le nombre d'exécutions qu'il contient.
Ma machine Les horaires seront exécutés sur ma machine. Il s'agit d'une installation ubuntu standard sur un processeur AMD FX-8350 à huit cœurs. Cela signifie également que je dois pouvoir exécuter votre code.
Réponses principales
- 49 par Anders Kaseorg en C . Simple thread et exécuté avec L = 12 (2 Go de RAM).
- 27 par cdlane en C .
{0,1}
chaînes de caractères, veuillez l'indiquer explicitement. Sinon, l'alphabet pourrait être infini, et je ne vois pas pourquoi vos tests devraient être optimaux, car il semble que vous n'ayez recherché que les {0,1}
chaînes.
n
jusqu'à 12
et il n'a jamais battu l'alphabet binaire. Heuristiquement, je m'attendrais à ce qu'une chaîne binaire soit optimale, car l'ajout de caractères augmente la longueur minimale d'une exécution.