cript

Autori: Lucia Miron
Publicat de: raresgherasa
Memorie: 2.0MB/1.0MB
Timp de execuție: 0.15s
Operații IO: cript.in/cript.out

Ilinca a citit despre criptarea mesajelor, acum dorește să comunice cu prietena ei Miruna numai prin mesaje criptate folosind un sistem propriu de criptare.

Ilinca ştie că fiecare caracter se reprezintă în memoria calculatorului pe $8$ biți, în care se memorează scrierea în baza $2$ a codului ASCII al caracterului respectiv. Pentru a cripta caracterul, Ilinca foloseşte o matrice pătratică având $8$ linii (numerotate de la $0$ la $7$ de sus în jos) şi $8$ coloane (numerotate de la $0$ la $7$ de la stânga la dreapta). Pe prima linie a matricei Ilinca scrie cei $8$ biţi reprezentând scrierea în baza $2$ a codului ASCII al caracterului, pe poziţia $0$ fiind scrisă cifra cea mai semnificativă (corespunzătoare lui $2^7$). Pe fiecare dintre următoarele $7$ linii din matrice scrie permutarea circulară cu o poziție la stânga a liniei anterioare. Ordonează lexicografic liniile matricei formate și defineşte cript-ul caracterului ca fiind succesiunea de biți reprezentată de ultima coloană din matrice, parcursă de sus în jos, urmată de indicele liniei din matrice pe care a ajuns după ordonarea lexicografică reprezentarea în baza $2$ a codului ASCII al caracterului. Dacă există linii egale în matrice, după ordonarea lexicografică acestea îşi vor păstra ordinea relativă iniţială, astfel că linia conţinând reprezentarea în baza $2$ a codului ASCII al caracterului va fi prima dintre acestea.

Pentru a cripta un mesaj, Ilinca scrie în ordine cript-urile caracterelor din mesajul respectiv.

Miruna cunoaşte sistemul de criptare al Ilincăi, ca urmare ştie să decripteze mesajele primite.

Cerinţă

Scrieți un program care să rezolve următoarele două cerinţe:

  1. citește un mesaj şi afişează mesajul criptat conform sistemului Ilincăi;
  2. citeşte un mesaj criptat conform sistemului Ilincăi şi determină mesajul decriptat.

Date de intrare

Fișierul de intrare cript.in conţine pe prima linie un număr natural $c$, care poate fi $1$ sau $2$, reprezentând cerinţa ce urmează a fi rezolvată. Pe a doua linie a fişierului se află un șir de caractere.

Date de ieşire

Fişierul de ieşire cript.out va conţine o singură linie pe care va fi scrisă criptarea șirului din fişierul de intrare (dacă $c=1$), respectiv decriptarea şirului din fişierul de intrare (dacă $c=2$).

Restricţii şi precizări

  • Lungimea mesajului necriptat este nenulă şi nu depăşeşte $30000$.
  • Caracterele din şirul citit au coduri cuprinse între $32$ și $127$.
  • Spunem că şirul $s_1$ precedă în ordinea lexicografică şirul $s_2$ dacă există o poziţie $k$ astfel încât $s_1[i]$ == $s_2[i]$ pentru orice $i < k$ şi $s_1[k]
    < s_2[k]$.
  • Pentru teste valorând 50% din punctaj cerinţa este $1$.

Exemplul 1

cript.in

1
AB

cript.out

100010004101000004

Explicaţii

Caracterul ‘$A$’ are codul ASCII $65$ reprezentarea pe $8$ biți fiind $01000001$.

Matricea permutărilor circulare este în stânga, iar în dreapta este matricea cu liniile ordonate lexicografic

01000001     00000101
10000010     00001010
00000101     00010100
00001010     00101000
00010100     01000001
00101000     01010000
01010000     10000010
10100000     10100000

Linia reprezentării lui ‘$A$’ are indicele $44$. Cript-ul caracterului ‘$A$’ este $100010004$. Se procedează analog pentru ‘$B$’.

Exemplul 2

cript.in

2
101110001111000002

cript.out

VI

Explicaţii

$101110001$ -cript-ul caracterului ‘$V$’

$111000002$ -cript-ul caracterului ’$I$’