Compresie

Time limit: 0.1s Memory limit: 4MB Input: compresie.in Output: compresie.out

Se consideră un text memorat într-o matrice MM, definită prin coordonatele colţului stânga sus (x1,y1)(x_1,y_1) şi coordonatele colţului dreapta jos (x2,y2)(x_2,y_2).

Prin aplicarea unui algoritm de compresie, matricei MM i se asociază un şir de caractere, notat CMC_M.

Şirul de caractere CMC_M este construit prin aplicarea următoarelor reguli:

a) dacă matricea MM are o singură linie şi o singură coloană atunci CMC_M conţine numai caracterul memorat în matrice
b) dacă toate elementele matricei sunt identice atunci întreaga matrice MM se comprimă şi CMC_M este şirul k+ck + c, unde kk reprezintă numărul de caractere din matrice, iar cc caracterul memorat
c) dacă matricea este formată din caractere diferite şi are cel puţin două linii şi două coloane atunci:

  • matricea este împărţită în 44 submatrice AA, BB, CC, DD după cum este ilustrat în figura alăturată, unde coordonatele colţului stânga sus ale submatricei AA sunt (x1,y1)(x_1,y_1), iar coordonatele colţului dreapta jos sunt (x2+x12,y2+y12)(\lfloor \frac{x_2+x_1}{2} \rfloor, \lfloor \frac{y_2+y_1}{2} \rfloor)
  • CMC_M este şirul * + CA+CB+CC+CD+\ C_A + C_B + C_C + C_D, unde CAC_A, CBC_B, CCC_C, CDC_D sunt şirurile de caractere obţinute, în ordine, prin compresia matricelor AA, BB, CC, DD utilizând acelaşi algoritm

d) dacă matricea este formată din caractere diferite, are o singură linie şi mai multe coloane atunci CMC_M este şirul * + CA+CB+\ C_A + C_B, unde AA, BB, CAC_A, CBC_B au semnificaţia descrisă la punctul c).
e) dacă matricea este formată din caractere diferite, are mai multe linii şi o singură coloană atunci CMC_M este şirul * + CA+CC+\ C_A + C_C unde AA, CC, CAC_A, CCC_C au semnificaţia descrisă la punctul c).

Cerinţă

Dat fiind şirul de caractere CMC_M ce se obţine în urma aplicării algoritmului de compresie asupra unei matrice MM de dimensiune NNN \cdot N să se determine:

a) numărul de împărţiri care au fost necesare pentru obţinerea textului compresat
b) matricea iniţială din care provine textul compresat.

Date de intrare

Fişierul de intrare ompresie.in conţine pe prima linie un şir de caractere ce reprezintă textul compresat.

Date de ieșire

Fişierul de ieșire compresie.out conţine:

  • pe prima linie un număr natural ce reprezintă numărul nrnr de împărţiri care au fost necesare pentru obţinerea textului compresat
  • pe următoarele NN linii se găsesc câte NN caractere, litere mici ale alfabetului englez, neseparate prin spații, ce reprezintă, în ordine, liniile matricei iniţiale.

Restricții și precizări

  • 2N1 0002 \leq N \leq 1 \ 000
  • 0nr1 000 0000 \leq nr \leq 1\ 000 \ 000
  • 22 ≤ lungimea şirului compresat 1 000 000≤ 1 \ 000 \ 000
  • Textul memorat iniţial în matricea MM conţine numai caractere din mulţimea literelor mici {\{a,, b,,, \dots, z}\}.
  • Pentru rezolvarea corectă a cerinţei a) se acordă 20%20\% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă tot punctajul.

Exemplul 1

compresie.in

*4b*bbab4a*abbb 

compresie.out

3 
bbbb
bbab
aaab
aabb

Explicație

Au fost efectuate 33 împărţiri:

  1. M=(bbbb)(bbab)(aaaa)(abbb)M = *\begin{pmatrix}b & b\\b & b\end{pmatrix}\begin{pmatrix}b & b\\a & b\end{pmatrix}\begin{pmatrix}a & a\\a & a\end{pmatrix}\begin{pmatrix}a & b\\b & b\end{pmatrix}
  2. (bbab)=(b)(b)(a)(b)\begin{pmatrix}b & b\\a & b\end{pmatrix} = *(b)(b)(a)(b)
  3. (abbb)=(a)(b)(b)(b)\begin{pmatrix}a & b\\b & b\end{pmatrix} = *(a)(b)(b)(b)

Exemplul 2

compresie.in

*4a*ab*aba

compresie.out

3 
aaa
aab
aba

Explicație

Au fost efectuate 33 împărţiri:

  1. M=(aaaa)(ab)(ab)(a)M = *\begin{pmatrix}a & a\\a & a\end{pmatrix}\begin{pmatrix}a\\b\end{pmatrix}\begin{pmatrix}a & b\end{pmatrix}\begin{pmatrix}a\end{pmatrix}
  2. (ab)=(a)(b)\begin{pmatrix}a\\b\end{pmatrix} = *(a)(b)
  3. (ab)=(a)(b)\begin{pmatrix}a & b\end{pmatrix} = *(a)(b)

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