Pagini recente » Cod sursa (job #36117) | Cod sursa (job #1800470) | Cod sursa (job #897353) | Cod sursa (job #1883045) | Cod sursa (job #3155044)
#include <fstream>
using namespace std;
ifstream cin ("bmatrix.in");
ofstream cout ("bmatrix.out");
int linii , coloane , maxim[4][202] , adancime[201];
char matrice[201][201];
void DeterminareArie (int pivot , int indice_maxim , bool vertical)
{
int optiuni[201] , stanga[201]; optiuni[0] = 0;
for (int indice = 1 ; indice <= (vertical ? linii : coloane) ; indice++)
{
adancime[indice] = ((vertical ? matrice[indice][pivot] : matrice[pivot][indice]) == '0' ? adancime[indice] + 1 : 0);
while (optiuni[0] && adancime[indice] <= adancime[optiuni[optiuni[0]]])
optiuni[0]--;
stanga[indice] = optiuni[optiuni[0]] + 1;
optiuni[++optiuni[0]] = indice;
}
optiuni[0] = 0;
for (int indice = (vertical ? linii : coloane) ; indice ; indice--)
{
while (optiuni[0] && adancime[indice] <= adancime[optiuni[optiuni[0]]])
optiuni[0]--;
const int dreapta = (optiuni[0] ? optiuni[optiuni[0]] - 1 : (vertical ? linii : coloane));
maxim[indice_maxim][pivot] = max(maxim[indice_maxim][pivot] , (dreapta - stanga[indice] + 1) * adancime[indice]);
optiuni[++optiuni[0]] = indice;
}
}
int main ()
{
cin >> linii >> coloane;
for (int linie = 1 ; linie <= linii ; linie++)
{ cin >> matrice[linie]; maxim[0][linie] = maxim[0][linie - 1]; DeterminareArie(linie , 0 , false); }
for (int indice = 1 ; indice <= coloane ; indice++)
adancime[indice] = 0;
for (int linie = linii ; linie ; linie--)
{ maxim[1][linie] = maxim[1][linie + 1]; DeterminareArie(linie , 1 , false); }
for (int indice = 1 ; indice <= coloane ; indice++)
adancime[indice] = 0;
for (int coloana = 1 ; coloana <= coloane ; coloana++)
{ maxim[2][coloana] = maxim[2][coloana - 1]; DeterminareArie(coloana , 2 , true); }
for (int indice = 1 ; indice <= linii ; indice++)
adancime[indice] = 0;
for (int coloana = coloane ; coloana ; coloana--)
{ maxim[3][coloana] = maxim[3][coloana + 1]; DeterminareArie(coloana , 3 , true); }
int arie_maxima = 0;
for (int linie = 0 ; linie <= linii ; linie++)
arie_maxima = max(arie_maxima , maxim[0][linie] + maxim[1][linie + 1]);
for (int coloana = 0 ; coloana <= coloane ; coloana++)
arie_maxima = max(arie_maxima , maxim[2][coloana] + maxim[3][coloana + 1]);
cout << (arie_maxima > 1 ? arie_maxima : 0);
cout.close(); cin.close();
return 0;
}