Szykuję się do olimpiady i potrzebuje pomocy z zadaniem oraz uzyskaniem pewnych wskazówek
Zadanie:
http://pl.spoj.com/problems/BFN4/
To co rozpisałem:
-
DANE OGÓLNE:
a) Klucz składa się z "n" liter ponumerowanych 0-25
b) x - zaszyfrowana wiadomosc
c) y - niezaszyfrowana wiadomość
d) k - klucz składający się z liczb 0 - 25
e) wzór klucza yi = ( xi+k1 + (i-1) mod n ) mod 26 -
WEJŚCIE:
a) Liczba testów (liczba <= 200)
b) Zestaw
Linia 1:
- Liczba "m"
- ogranicza długość klucza 1 <= n <= m <= 100000
Linia 2: - wiadomość x
nie wiem jaką długość ma wiadomość x
Linia 3: - wiadomość y
nie wiem jaką długość ma wiadomość y
Czego nie dopatrzyłem w zadaniu? Na razie stanąłem na długościach łańcuchów:
#include <iostream>
using namespace std;
struct TEST
{
int dlugosc_klucza;
char niezaszyfrowany[...];
char zaszyfrowany[...]
};
void konwertuj_na_liczby(char *tab);
void konwertuj_na_litery(char *tab);
int main()
{
int ILOSC_ZESTAWOW;
cin >> ILOSC_ZESTAWOW;
struct TEST *wsk = new TEST[ILOSC_ZESTAWOW];
}
Wziąłem do siebie to ostrzeżenie:
Uwaga: duże rozmiary plików wejścia/wyjścia, należy starannie przemyśleć wybór języka. Limit czasu działania programu jest dobrany restrykcyjnie.
Zastanawiam się, czy zamiast zbierać wszystkie informacje i dopiero rozwiązywać problem nie lepiej byłoby zrobić w sposób:
-
alokujemy pamięć na pierwszy test.
-
Zapisujemy rozwiązanie do zmiennej
-
Zwalniamy pamięć
-
Alokujemy pamięć na drugi test i tak dalej
-
Na końcu wyświetlamy wszystkie rozwiązania
Co Wy na to? To mogłoby zmniejszyć zużycie pamięci?
#include <iostream>
using namespace std;
void konwertuj_na_liczby(char *tab);
void konwertuj_na_litery(char *tab);
int main()
{
int ILOSC_ZESTAWOW;
cin >> ILOSC_ZESTAWOW;
int *dlugosc_klucza = NULL;
char *wiadomosc_x = NULL;
char *wiadomosc_y = NULL;
char* rozwiazania[ILOSC_ZESTAWOW];
}