Mehmet, miłośnik gier komputerowych, od 10 godzin gra w Immortal Grasshopper. Immortal Grasshopper to gra komputerowa, w której za pomocą przycisków sterujesz swoją postacią: konikiem polnym będącym mistrzem karate. Twoim przeciwnikiem jest mrówka sterowana przez komputer.
Konik polny może wykonywać łącznie $S$ ($1 \le S \le 4$) różnych ataków. Ataki te są nazwane pierwszymi $S$ literami alfabetu. Na przykład:
- $S = 2$: ataki mają nazwy $A$, $B$.
- $S = 4$: ataki mają nazwy $A$, $B$, $C$, $D$.
Każdy atak, który trafi przeciwnika, zadaje 1 punkt obrażeń.
Chociaż znasz zasady gry, Mehmet zasnął po 10 godzinach grania, więc nie ma nikogo, kto nauczyłby cię sterowania. Na stole znalazłeś kontroler z $N$ przyciskami (przyciski są ponumerowane od $0$ do $N - 1$). Po chwili grania zorientowałeś się, że każdy przycisk wykonuje jeden z $S$ różnych ataków, ale nie wiesz, który przycisk wykonuje jaki atak. Na szczęście dzięki naklejce na pierwszym przycisku widzisz, że wykonuje on atak typu $A$. Ponadto wiesz, że każdy rodzaj ataku jest przypisany do co najmniej jednego przycisku.
Twoim zadaniem jest ustalenie, grając w tę grę, jakie rodzaje ataków wykonują wszystkie przyciski kontrolera.
Grasz w sposób opisany poniżej. Aby zaatakować przeciwnika — mrówkę — używasz sekwencji przycisków zwanych kombinacjami. Kombinacja działa następująco:
- Tworzysz kombinację, naciskając kolejno dowolną liczbę przycisków.
- W obrębie kombinacji możesz naciskać przyciski w dowolnej kolejności.
- Ten sam przycisk można nacisnąć w kombinacji wielokrotnie.
- Kombinacja może mieć długość co najwyżej $400$.
Gra przyjmuje twoje ruchy i na koniec pokazuje łączne zadane przez ciebie obrażenia.
Obrażenia zadawane mrówce przez kombinację oblicza się następująco. Niech $t(X)$ oznacza atak, który w kolejności alfabetycznej następuje bezpośrednio po ataku $X$. Dla ataku oznaczonego ostatnią literą wartość $t(X)$ definiuje się jako atak $A$. Na przykład:
- Dla $S = 4$: $t(A) = B$, $t(B) = C$, $t(C) = D$, $t(D) = A$.
- Dla $S = 2$: $t(A) = B$, $t(B) = A$.
Mrówka może przeciwdziałać niektórym twoim atakom za pomocą podstępnych taktyk. Dokładniej, jeśli twoim ostatnim udanym (niezablokowanym) atakiem, który zadał obrażenia, był atak $X$, a jako następnego ataku użyjesz $t(X)$, mrówka zablokuje ten atak $t(X)$ i nie zadasz obrażeń. Jeśli nie może go zablokować, zadasz mrówce 1 punkt obrażeń (pierwszy atak zawsze zadaje obrażenia).
Twoim celem jest ustalenie i podanie ataków wykonywanych przez wszystkie przyciski przy użyciu jak najmniejszej łącznej liczby kombinacji.
Szczegóły implementacji
Należy zaimplementować następującą funkcję:
std::string olumsuz_cekirge(int N, int S)
- Wartość $N$ oznacza liczbę przycisków na kontrolerze.
- Wartość $S$ oznacza liczbę różnych rodzajów ataków w grze.
- Funkcja powinna zwrócić
stringdługości $N$, reprezentujący ataki przypisane do przycisków.
W tym celu możesz korzystać z poniższej funkcji kombo:
int kombo(std::vector<int> buton)
- Podczas każdego wywołania
olumsuz_cekirgemożesz wywołać funkcjękomboco najwyżej $400$ razy. - Tablica
butonokreśla indeksy przycisków, których chcesz użyć w kombinacji. - Wartości w tablicy
butonmuszą być liczbami całkowitymi od $0$ do $N - 1$. - Długość tablicy
butonmoże wynosić co najwyżej $400$.
W każdym teście należy rozwiązać $T$ niezależnych scenariuszy z tymi samymi wartościami $N$ i $S$. Dla każdego niezależnego scenariusza funkcja olumsuz_cekirge zostanie wywołana raz.
Ograniczenia
- $1 \le T \le 100$
- $4 \le N \le 400$
- $1 \le S \le 4$
- Program oceniający nie jest adaptacyjny. Dokładniej, dane wejściowe są ustalone przed wywołaniem funkcji
olumsuz_cekirgei nie zmieniają się podczas wykonywania operacji.
Podzadania
Liczba punktów za $i$-te podzadanie wynosi $0$, jeśli w dowolnym scenariuszu funkcja kombo zostanie wywołana z parametrami niespełniającymi powyższych warunków lub funkcja olumsuz_cekirge zwróci niepoprawny wynik. W przeciwnym razie liczba punktów jest równa wartości następującego wzoru:
$$P_i \times \min\left(1,\left(\frac{400-q}{400-Q_i}\right)^3\right)$$
- Wartość $P_i$ oznacza maksymalną łączną liczbę punktów, którą można otrzymać za $i$-te podzadanie.
- Wartość $q$ oznacza maksymalną liczbę wywołań funkcji
kombow jednym scenariuszu spośród scenariuszy we wszystkich testach $i$-tego podzadania. - Wartości $Q_i$ podano w opisach podzadań.
| Podzadania | Punkty | Dodatkowe ograniczenia | Zależności |
|---|---|---|---|
| 1 | 1 | $S = 1, Q_1 = 0, P_1 = 1$ | — |
| 2 | 15 | $S = 2, Q_2 = 50, P_2 = 15$ | — |
| 3 | 40 | $S = 3, Q_3 = 80, P_3 = 40$ | — |
| 4 | 44 | $S = 4, Q_4 = 103, P_4 = 44$ | — |
Przykład
olumsuz_cekirge(6, 3)
W przykładach ataki odpowiadające kolejnym przyciskom to ABCBBA, więc funkcja powinna zwrócić ten napis.
kombo([0, 1, 2])
Powyższe wywołanie zwraca $2$. Ataki w tej kombinacji to $ABC$. Pierwszy atak $A$ trafia. Atak $B$ zostaje zablokowany. Ponieważ ostatnim atakiem, który zadał obrażenia, był $A$, mrówka nie może zablokować ataku $C$ i otrzymuje obrażenia.
kombo([0, 0, 0])
Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $AAA$. Wszystkie ataki $A$ zadają obrażenia.
kombo([5, 1, 3, 2, 2, 0])
Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $ABBCCA$. Pierwszy atak $A$ trafia. Atak $B$ zostaje zablokowany. Ponieważ ostatnim trafionym atakiem nadal jest $A$, drugi atak $B$ również zostaje zablokowany. Pierwszy i drugi atak $C$ zadają obrażenia. Ponieważ ostatnim trafionym atakiem jest $C$, mrówka oczekuje ataku $A$, więc ostatni atak $A$ zostaje zablokowany.
kombo([2, 2, 1])
Powyższe wywołanie zwraca $3$. Ataki w tej kombinacji to $CCB$. Wszystkie ataki zadają obrażenia.
Przykładowy program oceniający
Przykładowy program oceniający wczytuje dane wejściowe w następującym formacie, w którym $C_i$ jest napisem długości $N$ reprezentującym ukryte ataki przycisków w $i$-tym scenariuszu:
$$\begin{gathered}T\ N\ S\\C_1\\C_2\\\ldots\\C_T\end{gathered}$$
Dla każdego scenariusza wypisuje następujący wynik: jeśli scenariusz został rozwiązany poprawnie, wypisywana jest łączna liczba użytych operacji. Jeśli wystąpił błąd, wypisywany jest jeden z poniższych komunikatów błędu:
Yanlis cevap (Wrong answer) Buton asildi (Button limit exceeded) Yanlis buton (Invalid button) Kombo asildi (Combo limit exceeded)
Yanlis cevap (Wrong answer): Wypisywany, jeśli odpowiedź dla któregokolwiek przycisku jest błędna.Buton asildi (Button limit exceeded): Zwracany, jeśli w jednym wywołaniu funkcjikomboużyto więcej niż $400$ przycisków.Yanlis buton (Invalid button): Zwracany, jeśli w wywołaniu funkcjikomboktóryś indeks przycisku nie jest liczbą pomiędzy $0$ a $N - 1$.Kombo asildi (Combo limit exceeded): Zwracany, jeśli podczas jednego wywołania funkcjiolumsuz_cekirgefunkcjękombowywołano więcej niż $400$ razy.