Draganče radi za kontraobaveštajnu službu. On je otkrio
da se šifrovane poruke neprijatelja uvek dobijaju linearnim
preslikavanjem. Najpre se svako slovo predstavi brojem od 0 do
n - 1, gde je n broj slova u pismu (ove brojeve ćemo zvati
indeksima slova). Potom se šifra zada u obliku y = (a +
b · x) mod n, gde je nzd(b, n) = 1. To znači da se slovo
predstavljeno brojem x šifrira slovom koje je predstavljeno
brojem y (y = (a + b · x) mod n). Pored saznanja o
načinu šifrovanja poruka, Draganče ima i podatke o
učestanosti svih slova u jeziku neprijatelja. Za svako slovo
x se zna očekivani procenat pojavljivanja p(x) u
proizvoljnom tekstu. Treba pomoći Dragančetu da
dešifruje jednu izuzetno važnu poruku uz pomoć
statistike i saznanja o linearnom šifrovanju.
Potrebno je izvršiti dešifrovanje tako da se statistika u
dobijenom tekstu što više poklapa sa očekivanom
statistikom. Kvalitet poklapanja za odredjeno slovo se meri tako
što se najpre izračuna učestanost tog slova u
dešifrovanom tekstu
dc(x) (broj pojavljivanja slova
x
podeljen sa ukupnim brojem slova u tekstu). Potom se kvalitet
poklapanja
q(x) računa kao
(p(x)-dc(x))2. Kvalitet
poklapanja čitavog dešifrovanog teksta se računa kao suma
kvaliteta poklapanja svih slova.
Ulaz.
(Ulazni podaci se nalaze u datoteci sifra.in)
U prvom redu se nalazi prirodan broj n,
3 ≤ n ≤ 26, ukupan broj slova u neprijateljskom
alfabetu. Sledi n redova i u svakom je dato jedno slovo iz
alfabeta i jedan broj, razdvojeni razmakom. Slovo u prvom redu ima
indeks 0, u drugom 1, ... u n-tom redu ima indeks n - 1. Slovo
je uvek predstavljeno kao veliko slovo iz engleskog alfabeta, dok
broj predstavlja procenat učestanosti datog slova u
proizvoljnom tekstu. Procenat je zadat sa dve decimale. Slovo
imaju različite učestanosti, a ukupan zbir svih
učestanosti je 100. U sledećem redu je ceo broj L
(10 ≤ L ≤ 1000) i on predstavlja dužinu
šifrovanog teksta. U poslednjem redu, nalazi se tekst od
tačno L slova (bez razmaka i znakova interpunkcije) koji
predstavljaju šifrovani tekst. Sva slova koja se nalaze u
šifrovanom tekstu su prethodno već zadata sa svojim
učestanostima.
Izlaz.
(Izlazne podatke upisati u datoteku sifra.out) U jedinom redu izlaza treba ispisati
dešifrovani tekst, dešifrovan preko linearnog preslikavanja,
a koji najviše odgovara zadatoj statistici.
Primer 1.
sifra.in
|
|
sifra.out
|
4
B 42.25
A 20.00
Z 10.15
E 27.60
8
AZABAZEBAZ
|
|
BEBABEZABE
|
Napomena.
Na osnovu ulaza imamo se slova predstavljaju brojevima od 0
do 3 na sledeći nachin: B → 0, A → 1, Z → 2 i E →
3. Preslikavanje kod kog se dobija najbolje preklapanje je y =
(a + b · x) mod 4, gde su a = 1 i b = 3.