Twoim zadaniem jest rozwiązanie problemu najdłuższej wspólnej sekwencji dla n ciągów o długości 1000.
Prawidłowe rozwiązanie problemu LCS przez dwa lub więcej ciągów S 1 , S ... n jest dowolny ciąg T maksymalnej długości tak, że znaki T pojawiają się we wszystkich S I , w tej samej kolejności jak w T .
Zauważmy, że T nie musi być sub ciąg od S í .
Ten problem rozwiązaliśmy już przy użyciu jak najmniejszej ilości kodu . Tym razem rozmiar nie ma znaczenia.
Przykład
Ciągi znaków axbycz
i xaybzc
mają 8 wspólnych podciągów o długości 3:
abc abz ayc ayz xbc xbz xyc xyz
Każde z nich stanowiłoby prawidłowe rozwiązanie problemu LCS.
Detale
Napisz pełny program, który rozwiąże problem LCS, jak wyjaśniono powyżej, przestrzegając następujących zasad:
Dane wejściowe będą składać się z dwóch lub więcej ciągów o długości 1000, składających się ze znaków ASCII z punktami kodowymi od 0x30 do 0x3F.
Musisz odczytać dane wejściowe ze STDIN.
Masz dwie możliwości wyboru formatu wejściowego:
Po każdym łańcuchu (w tym ostatnim) znajduje się znak linii.
Sznurki są połączone łańcuchem, bez separatora i bez podawania linii.
Liczba ciągów znaków zostanie przekazana do programu jako parametr wiersza polecenia.
Musisz zapisać dane wyjściowe, tj. Dowolne z poprawnych rozwiązań LCS, STDOUT, a następnie jeden wiersz.
Twój wybrany język musi mieć darmowy (jak w piwie) kompilator / tłumacz dla mojego systemu operacyjnego (Fedora 21).
Jeśli potrzebujesz flag kompilatora lub konkretnego interpretera, podaj to w swoim poście.
Punktacja
Uruchomię kod z ciągami 2, 3 itd., Dopóki wydrukowanie prawidłowego rozwiązania nie zajmie więcej niż 120 sekund. Oznacza to, że masz 120 sekund na każdą wartość n .
Najwyższą liczbą ciągów, dla których kod zakończył się w czasie, jest twój wynik.
W przypadku remisu n , zgłoszenie, które rozwiązało problem n strun w jak najkrótszym czasie, zostanie ogłoszone zwycięzcą.
Wszystkie zgłoszenia będą synchronizowane na moim komputerze (Intel Core i7-3770, 16 GiB RAM, bez wymiany).
Gdy n struny (n-1) p testu zostanie wygenerowany przez wywołanie rand n
(i odpędzenie karetki, jeśli wymagane), w którym rand
określa się, jak następuje:
rand()
{
head -c$[500*$1] /dev/zero |
openssl enc -aes-128-ctr -K 0 -iv $1 |
xxd -c500 -ps |
tr 'a-f' ':-?'
}
Klucz znajduje się 0
w powyższym kodzie, ale zastrzegam sobie prawo do zmiany go na nieujawnioną wartość, jeśli podejrzewam, że ktoś (częściowo) zakodował wynik.
public static void main(...)
?