cript

Time limit: 0.03s Memory limit: 2MB Input: cript.in Output: 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 88 biți, în care se memorează scrierea în baza 22 a codului ASCII\text{ASCII} al caracterului respectiv. Pentru a cripta caracterul, Ilinca foloseşte o matrice pătratică având 88 linii (numerotate de la 00 la 77 de sus în jos) şi 88 coloane (numerotate de la 00 la 77 de la stânga la dreapta). Pe prima linie a matricei Ilinca scrie cei 8 biţi reprezentând scrierea în baza 22 a codului ASCII\text{ASCII} al caracterului, pe poziţia 00 fiind scrisă cifra cea mai semnificativă (corespunzătoare lui 272 ^ 7). Pe fiecare dintre următoarele 77 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 22 a codului ASCII\text{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 22 a codului ASCII\text{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 cc, care poate fi 11 sau 22, 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=1c = 1), respectiv decriptarea şirului din fişierul de intrare (dacă c=2c = 2).

Restricţii şi precizări

  • Lungimea mesajului necriptat este nenulă şi nu depăşeşte 30 00030 \ 000.
  • Caracterele din şirul citit au coduri cuprinse între 3232 și 127127.
  • Spunem că şirul s1s_1 precedă în ordinea lexicografică şirul s2s_2 dacă  k\exists \ k astfel încât s1i==s2i, i<ks_{1_i} == s_{2_i}, \forall \ i < k şi s1k<s2ks_{1_k} < s_{2_k}.
  • Pentru teste valorând 50%50\% din punctaj cerinţa este 11.

Exemplul 1

cript.in

1
AB

cript.out

100010004101000004

Explicaţie

Caracterul A are codul ASCII 65\text{ASCII} \ 65 reprezentarea pe 88 biți fiind 0100000101000001
Matricea permutărilor circulare este în stânga, iar în dreapta este matricea cu liniile ordonate lexicografic:

01000001         0000010101000001 \ \ \ \ \ \ \ \ \ 00000101
10000010         0000101010000010 \ \ \ \ \ \ \ \ \ 00001010
00000101         0001010000000101 \ \ \ \ \ \ \ \ \ 00010100
00001010         0010100000001010 \ \ \ \ \ \ \ \ \ 00101000
00010100         0100000100010100 \ \ \ \ \ \ \ \ \ 01000001
00101000         0101000000101000 \ \ \ \ \ \ \ \ \ 01010000
01010000         1000001001010000 \ \ \ \ \ \ \ \ \ 10000010
10100000         1010000010100000 \ \ \ \ \ \ \ \ \ 10100000

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

Exemplul 2

cript.in

2
101110001111000002

cript.out

VI

Explicaţie

101110001=cript-ul caracterului101110001 = \text{cript-ul caracterului} V
111000002=cript-ul caracterului111000002 = \text{cript-ul caracterului} I

Log in or sign up to be able to send submissions!