Mistrzostwa Polski Szkół Średnich w Programowaniu Zespołowym 2024
Problem description
Podciągiem słowa A nazwiemy każde słowo, które możemy
uzyskać usuwając niektóre litery z A i odczytując pozostałe nie
zmieniając ich kolejności. Dla przykładu, bef
jest
podciągiem słowa abcdefg
, zaś gf
nie jest.
Jasio na lekcji informatyki dowiedział się jak rozwiązać problem znalezienia najdłuższego wspólnego podciągu dwóch słów, czyli najdłuższego słowa, które jest podciągiem obu danych słów. Po powrocie do domu chłopak bez chwili zastanowienia zaczął rozwiązywać zadanie domowe, polegające na zaimplementowaniu poznanego algorytmu. Udało mu się napisać poprawny kod, chociaż, co później wypomniała mu nauczycielka, nieoptymalny czasowo 1.
[N+1][N+1];
string dp(string a, string b) {
string lcsfor (int i = 1; i <= a.size(); ++i) {
for (int j = 1; j <= b.size(); ++j) {
if (a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + a[i-1];
else if (dp[i-1][j].size() >= dp[i][j-1].size()) dp[i][j] = dp[i-1][j];
else dp[i][j] = dp[i][j-1];
}
}
return dp[a.size()][b.size()];
}
Na liście zadań znajdowało się również zadanie bonusowe, które polegało na zaimplementowaniu algorytmu znajdującego najdłuższy wspólny podciąg trzech ciągów. Jasio stwierdził, że to nic trudnego – w końcu może wykorzystać swoją poprzednią implementację i najpierw znaleźć najdłuższy wspólny podciąg dwóch pierwszych słów, a następnie najdłuższy wspólny podciąg znalezionego słowa oraz słowa trzeciego.
(string a, string b, string c) {
string lcs3return lcs(lcs(a, b), c);
}
Testy w tym zadaniu były dość słabe i okazało się, że (oczywiście błędne) rozwiązanie Jasia przeszło wszystkie testy. Chłopak chwali się, że jest mistrzem algorytmów tekstowych. Jako osoba z klasy Jasia, która poprawnie rozwiązała zadanie bonusowe, czujesz, że trzeba go sprowadzić na ziemię.
Napisz program, który dla danych liczb N, L, J, wyznaczy trzy słowa o długości N, składające się z małych liter alfabetu angielskiego, których najdłuższy wspólny podciąg ma L liter, a program Jasia zwróci słowo o długości J, lub stwierdź, że nie istnieją takie trzy słowa.
Wejście
W pierwszym (jedynym) wierszu wejścia znajdują się trzy liczby całkowite N, L, J, pooddzielane pojedynczymi odstępami.
Wyjście
Jeżeli istnieje kontrprzykład zgodny z treścią zadania, wypisz trzy
słowa w trzech wierszach. Kolejność ma znaczenie! W przeciwnym wypadku
wypisz jeden wiersz zawierający słowo ACCEPTED
.
Jeżeli istnieje wiele możliwych poprawnych odpowiedzi, Twój program może wypisać dowolną z~nich.
Ograniczenia
1 ≤ N ≤ 100, 0 ≤ J ≤ L ≤ N.
Przykład
Wejście | Wyjście | Wyjaśnienie |
|
|
Program Jasia obliczy, że najdłuższy
podciąg dwóch pierwszych słów to Najdłuższy wspólny podciąg ma 5
liter, na przykład |
Wejście | Wyjście | |
|
|
Implementacja Jasia działa w złożoności O(n3) zamiast O(n2) ze względu na kopiowanie słów. Dla odpowiednio dobranych danych może się zdarzyć, że tablica
dp
będzie wypełniona Ω(n2) słowami o długości Ω(n).↩︎