Cerința
Considerăm codificarea binară a caracterelor, în care fiecărui simbol îi revine reprezentarea pe 8 biți a codului său ASCII. De exemplu, caracterului ’A’, având codul ASCII 65, îi va corespunde reprezentarea binară 01000001.
Scrieți un program care citește din fișierul convert_submatrix.in un șir s format din n ≤ 100 caractere și construiește o matrice M cu n linii și 8 coloane, linia i a matricii reprezentând codificarea binară a caracterului de pe poziția i din șir. Se cere determinarea dimensiunii celei mai mari submatrice pătratice a lui M, care conține elemente cu aceeași valoare (fie 0, fie 1). Valoarea determinată se scrie în fișierul convert_submatrix.out.
Date de intrare
Fișierul de intrare convert_submatrix.in conține pe prima linie șirul s format din cel mult 100 de caractere.
Date de ieșire
Fișierul de ieșire convert_submatrix.out va conține pe prima linie numărul rez, reprezentând dimensiunea celei mai mari submatrici pătratice a lui m conținând elemente cu aceeași valoare (fie 0, fie 1).
Restricții și precizări
- lungimea șirului:
1 ≤ n ≤ 100 - șirul poate să conțină:
ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789 `~,./;:][}{+_=-|!#$%^&*()
Exemplul 1:
convert_submatrix.in
IDEEA
convert_submatrix.out
3
Explicație
Matricea corespunzătoare șirului citit este:
Se observă că dimensiunea celei mai mari submatrici pătratice a lui m conținând elemente cu aceeași valoare este 3.
Exemplul 2:
convert_submatrix.in
AAAyyyy
convert_submatrix.out
4
Explicație
Matricea corespunzătoare șirului citit este:
Se observă că dimensiunea celei mai mari submatrici pătratice a lui m conținând elemente cu aceeași valoare este 4.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("convert_submatrix.in");
ofstream cout("convert_submatrix.out");
char s[101];
int m[101][10], maxi = 1;
bool inmat(int i, int j){
return i < strlen(s) && j <= 8;
}
int ok(int i1, int j1, int i2, int j2){
int cnt = 0;
if(i2-i1 == j2-j1 && inmat(i2,j2)){
for(int i = i1; i <= i2; ++i)
for(int j = j1; j <= j2; ++j)
cnt+=m[i][j];
if(cnt == 0 || cnt == (i2-i1+1)*(j2-j1+1))
return i2-i1+1;
}
return -1;
}
int main(){
cin.getline(s, 101);
int i = 0;
while(s[i]){
int x = s[i];
int j = 8;
while(x){
m[i][j--] = x % 2;
x/=2;
}
i++;
}
for(int i = 0; i < strlen(s); ++i)
for(int j = 1; j <= 8; ++j)
for(int t = 0; t <= 7; ++t)
maxi = max(ok(i,j,i+t,j+t), maxi);
cout << maxi;
return 0;
}