TAKMIČENJA IZ PROGRAMIRANJA


Sva pitanja, predloge ili primedbe u vezi sa takmičenjima iz programiranja možete slati na e-mail:

tak.prog@gmail.com

U toku perioda za žalbe, sve žalbe možete slati na ovaj isti e-mail.

agenti.pas    1,022 b      izvorni kod rešenja
agenti.checker.pas    434 b      program za testiranje
agenti.tests.rar    305,234 b      test primeri

zadatak: Agenti

Većina ljudi misli da se špijuni nalaze samo u filmovima o Džejmsu Bondu. Međutim, da to nije tačno mogli su se uveriti i domaći bezbedonosni agenti koji su u jednom skladištu pronašli mašinu za kriptovanje, koju koriste strani špijuni. Oni su i ranije persretali poruke, ali nisu mogli ni da shvate kako su kriptovane. Sada su, međutim, pronašli sistem i zamolili su vas da napišete program koji će automatski dekriptovati presretnute poruke.

Princip rada mašine je sledeći: ulazni podataka je poruka koja se sastoji samo od malih slova latinice S1 = s1s2...sN . Mašina zatim generiše sve ciklične permutacije S2 = s2s3...sNs1, S2 = s3s4...sNs1 s2, ..., SN = sNs1s2...sN-1 i sortira ih u leksikografskom poretku. Na ovaj način se dobija matrica dimenzija NхN (u i-toj vrsti matrice je i-ta po redu permutacija u sortiranom nizu permuacija, a u okviru jedne vrste elementi su pojedinačna slova u okviru permutacije koja se nalazi u toj vrsti). Kodirana poruka se sastoji od rednog broja vrste (označimo ga sa K) u kojoj se nalazi originalna poruka i spiska slova koja se nalaze u poslednjoj koloni matrice. Evo primera. Za poruku S1 = abracadabra imamo sledeći niz permutacija (nakon sortiranja):

 1. aabracadabr = S11 
 2. abraabracad = S8 
 3. abracadabra = S1 
 4. acadabraabr = S4 
 5. adabraabrac = S6 
 6. braabracada = S9 
 7. bracadabraa = S2 
 8. cadabraabra = S5 
 9. dabraabraca = S7 
10. raabracadab = S10 
11. racadabraab = S3

Prema tome, šifrovana poruka je: 3 rdarcaaaabb.

Ulaz:

U prvom redu tekstualne datoteke agenti.in nalazi se prirodan broj K (redni broj vrste matrice u kojoj se nalazi originalna poruka). U drugom redu nalazi se N (1 < N ≤ 100000) slova koji predstavljaju zadnju kolonu matrice. Između slova nema razmaka.

Izlaz:

U prvom redu tekstualne datoteke agenti.out treba ispisati originalnu poruku.

Primer:

agenti.in      agenti.out
3
rdarcaaaabb
        
abracadabra
fajl: agenti.pas
program agenti;
var
  a:array[1..100000] of char;
  next:array[1..100000] of longint;
  i,k,n:longint;
  ch:char;
procedure sort(l,r:longint);
var
  i,j:longint;
  k,t:longint;
begin
  i:=l;
  j:=r;
  k:=next[(i+j) div 2];
  while i<=j do
    begin
      while (a[next[i]]<a[k]) or ((a[next[i]]=a[k]) and (next[i]<k)) do inc(i);
      while (a[k]<a[next[j]]) or ((a[next[j]]=a[k]) and (k<next[j])) do dec(j);
      if i<=j then
        begin
          t:=next[i];
          next[i]:=next[j];
          next[j]:=t;
          inc(i);
          dec(j)
        end
    end;
  if i<r then sort(i,r);
  if l<j then sort(l,j)
end;
begin
  assign(input,'agenti.in');
  reset(input);
  readln(k);
  n:=0;
  while not eof do
    begin
      read(ch);
      inc(n);
      a[n]:=ch;
      next[n]:=n
    end;
  close(input);
  sort(1,n);
  assign(output,'agenti.out');
  rewrite(output);
  for i:=1 to n do
    begin
      k:=next[k];
      write(a[k])
    end;
  close(output)
end.