Ihre Aufgabe ist es, das Problem der längsten gemeinsamen Folge für n Zeichenfolgen mit einer Länge von 1000 zu lösen .
Eine gültige Lösung für das LCS-Problem für zwei oder mehr Zeichenfolgen S 1 ,… S n ist eine beliebige Zeichenfolge T mit maximaler Länge, so dass die Zeichen von T in allen S i in derselben Reihenfolge wie in T erscheinen .
Beachten Sie, dass T nicht Teil sein muss Zeichenfolge von S i .
Wir haben dieses Problem bereits in kürzester Zeit gelöst . Diesmal spielt die Größe keine Rolle.
Beispiel
Die Strings axbycz
und xaybzc
haben 8 gemeinsame Teilsequenzen der Länge 3:
abc abz ayc ayz xbc xbz xyc xyz
All dies wäre eine gültige Lösung für das LCS-Problem.
Einzelheiten
Schreiben Sie ein vollständiges Programm, das das LCS-Problem wie oben erläutert löst und dabei die folgenden Regeln einhält:
Die Eingabe besteht aus zwei oder mehr Zeichenfolgen der Länge 1000, die aus ASCII-Zeichen mit Codepunkten zwischen 0x30 und 0x3F bestehen.
Sie müssen die Eingabe von STDIN lesen.
Sie haben zwei Möglichkeiten für das Eingabeformat:
Auf jede Zeichenfolge (einschließlich der letzten) folgt ein Zeilenvorschub.
Die Saiten sind ohne Trennzeichen und ohne nachlaufenden Zeilenvorschub miteinander verkettet.
Die Anzahl der Zeichenfolgen wird als Befehlszeilenparameter an Ihr Programm übergeben.
Sie müssen die Ausgabe, dh eine der gültigen Lösungen für das LCS, in STDOUT schreiben, gefolgt von einem Zeilenvorschub.
Ihre bevorzugte Sprache muss einen kostenlosen Compiler / Interpreter (wie in Bier) für mein Betriebssystem (Fedora 21) haben.
Wenn Sie Compiler-Flags oder einen bestimmten Interpreter benötigen, erwähnen Sie dies bitte in Ihrem Beitrag.
Wertung
Ich werde Ihren Code mit 2, 3 usw. Zeichenfolgen ausführen, bis das Drucken einer gültigen Lösung länger als 120 Sekunden dauert. Dies bedeutet, dass Sie für jeden Wert von n 120 Sekunden Zeit haben .
Die höchste Anzahl von Zeichenfolgen, für die Ihr Code rechtzeitig fertiggestellt wurde, ist Ihre Punktzahl.
Bei einem Gleichstand von n wird die Einsendung, die das Problem für n Strings in kürzester Zeit gelöst hat , zum Gewinner erklärt.
Alle Einsendungen werden auf meinem Computer zeitgesteuert (Intel Core i7-3770, 16 GiB RAM, kein Swap).
Die n Zeichenfolgen des (n-1) -ten Tests werden durch Aufrufen rand n
(und Entfernen der Zeilenvorschübe, falls erforderlich) generiert , wobei rand
Folgendes definiert ist:
rand()
{
head -c$[500*$1] /dev/zero |
openssl enc -aes-128-ctr -K 0 -iv $1 |
xxd -c500 -ps |
tr 'a-f' ':-?'
}
Der Schlüssel befindet sich 0
im obigen Code, aber ich behalte mir das Recht vor, ihn in einen nicht genannten Wert zu ändern, wenn ich den Verdacht habe, dass jemand die Ausgabe (teilweise) fest codiert.
public static void main(...)
?