Mistrzostwa Polski Szkół Średnich w Programowaniu Zespołowym 2024

2020-2022 2023 Regulations Schedule RODO info Ranking

Problem description


Kontrprzykład
(kontrprzyklad)
Limit pamięci: 128 MB
Limit czasu: 1.00 s

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.

string dp[N+1][N+1];
string lcs(string a, string b) {
    for (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 lcs3(string a, string b, string c) {
    return 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
10 5 3
eckoyzleak
kozalkoeox
kixdoezakw

Program Jasia obliczy, że najdłuższy podciąg dwóch pierwszych słów to kozle, a następnie, że najdłuższy wspólny podciąg kozle i trzeciego słowa to koz.

Najdłuższy wspólny podciąg ma 5 liter, na przykład kozak.

Wejście Wyjście
10 10 0
ACCEPTED

  1. 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).↩︎