Votre tâche consiste à résoudre le problème de la séquence la plus longue commune pour n chaînes de longueur 1000.
Une solution valable au problème LCS pour deux ou plusieurs chaînes de 1 , ... S n est une chaîne T de longueur maximale telle que les caractères de T apparaissent dans tous les S i , dans le même ordre que dans T .
Notez que T ne doit pas nécessairement être une sous- chaîne de S i .
Nous avons déjà résolu ce problème dans la quantité de code la plus courte . Cette fois, la taille n'a pas d'importance.
Exemple
Les chaînes axbycz
et xaybzc
ont 8 sous-séquences communes de longueur 3:
abc abz ayc ayz xbc xbz xyc xyz
N'importe lequel d'entre eux serait une solution valable pour le problème LCS.
Détails
Écrivez un programme complet qui résout le problème LCS, comme expliqué ci-dessus, en respectant les règles suivantes:
L'entrée consistera en deux ou plusieurs chaînes de longueur 1000, composées de caractères ASCII avec des points de code compris entre 0x30 et 0x3F.
Vous devez lire l'entrée de STDIN.
Vous avez deux choix pour le format d'entrée:
Chaque chaîne (y compris la dernière) est suivie d'un saut de ligne.
Les chaînes sont enchaînées sans séparateur ni saut de ligne arrière.
Le nombre de chaînes sera transmis en tant que paramètre de ligne de commande à votre programme.
Vous devez écrire la sortie, c'est-à-dire l'une des solutions valides du LCS, dans STDOUT, suivie d'un saut de ligne.
Votre langue de choix doit avoir un compilateur / interprète gratuit (comme dans la bière) pour mon système d'exploitation (Fedora 21).
Si vous avez besoin de drapeaux de compilation ou d'un interprète spécifique, veuillez le mentionner dans votre message.
Notation
Je vais exécuter votre code avec 2, 3, etc. chaînes jusqu'à ce qu'il prenne plus de 120 secondes pour imprimer une solution valide. Cela signifie que vous disposez de 120 secondes pour chaque valeur de n .
Le nombre le plus élevé de chaînes pour lesquelles votre code s'est terminé dans le temps est votre score.
En cas d'égalité de n , la soumission ayant résolu le problème pour n chaînes dans les plus brefs délais sera déclarée gagnante.
Toutes les soumissions seront chronométrées sur ma machine (Intel Core i7-3770, 16 Go de RAM, pas de swap).
Les n chaînes du (n-1) e test seront générées en appelant rand n
(et en supprimant les sauts de ligne, si demandé), où rand
est défini comme suit:
rand()
{
head -c$[500*$1] /dev/zero |
openssl enc -aes-128-ctr -K 0 -iv $1 |
xxd -c500 -ps |
tr 'a-f' ':-?'
}
La clé est 0
dans le code ci-dessus, mais je me réserve le droit de la changer en une valeur non divulguée si je soupçonne quelqu'un de coder en dur (partiellement) la sortie.
public static void main(...)
?