Su tarea es resolver el problema de la subsecuencia común más larga para n cadenas de longitud 1000.
Una solución válida al problema LCS para dos o más cadenas S 1 , ... S n es cualquier cadena de T de la longitud máxima de tal manera que los personajes de T aparecen en todos los S i , en el mismo orden que en T .
Tenga en cuenta que T no tiene que ser una subcadena de S i .
Ya hemos resuelto este problema en la menor cantidad de código . Esta vez, el tamaño no importa.
Ejemplo
Las cadenas axbycz
y xaybzc
tienen 8 subsecuencias comunes de longitud 3:
abc abz ayc ayz xbc xbz xyc xyz
Cualquiera de estos sería una solución válida para el problema de LCS.
Detalles
Escriba un programa completo que resuelva el problema de LCS, como se explicó anteriormente, respetando las siguientes reglas:
La entrada constará de dos o más cadenas de longitud 1000, que consta de caracteres ASCII con puntos de código entre 0x30 y 0x3F.
Tienes que leer la entrada de STDIN.
Tiene dos opciones para el formato de entrada:
A cada cadena (incluida la última) le sigue un salto de línea.
Las cadenas se encadenan sin separador y sin avance de línea.
El número de cadenas se pasará como un parámetro de línea de comando a su programa.
Debe escribir la salida, es decir, cualquiera de las soluciones válidas para el LCS, en STDOUT, seguido de un salto de línea.
Su idioma de elección debe tener un compilador / intérprete gratuito (como en cerveza) para mi sistema operativo (Fedora 21).
Si necesita algún indicador de compilación o un intérprete específico, por favor mencionelo en su publicación.
Puntuación
Ejecutaré su código con 2, 3, etc. cadenas hasta que tarde más de 120 segundos en imprimir una solución válida. Esto significa que tiene 120 segundos para cada valor de n .
La mayor cantidad de cadenas para las cuales su código terminó a tiempo es su puntaje.
En el caso de un puntaje empatado de n , la presentación que resolvió el problema para n cadenas en el menor tiempo será declarada ganadora.
Todos los envíos serán programados en mi máquina (Intel Core i7-3770, 16 GiB RAM, sin intercambio).
Los n cuerdas de la (n-1) ésimo prueba se generará llamando rand n
(y extracción de los avances de línea, si se solicita), donde rand
se define como sigue:
rand()
{
head -c$[500*$1] /dev/zero |
openssl enc -aes-128-ctr -K 0 -iv $1 |
xxd -c500 -ps |
tr 'a-f' ':-?'
}
La clave está 0
en el código anterior, pero me reservo el derecho de cambiarlo a un valor no revelado si sospecho que alguien está (parcialmente) codificando la salida.
public static void main(...)
?