Cod sursa(job #2884217)

Utilizator David8406Marian David David8406 Data 2 aprilie 2022 16:56:32
Problema BMatrix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;
int n,h[205],pst[205],pdr[205],m,a[205][205],rez,nr0[205][205],b[205][205],A[5][205];
string line;
stack <int> s;
ifstream fin("bmatrix.in");
ofstream fout("bmatrix.out");
void rotate()
{
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
            b[i][j]=a[i][j];
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
        {
            a[j][m-i+1]=b[i][j];
        }
    swap(n,m);
}
int main()
{
    fin>>m>>n;
    for (int i=1;i<=m;i++)
    {
        fin>>line;
        for (int j=1;j<=n;j++)
        {
            a[i][j]=line[j-1]-'0';
        }
    }
    for (int q=1;q<=4;q++)
    {
        for (int i=1;i<=m;i++)
            for (int j=1;j<=n;j++)
            {
                if (a[i][j]==0)
                    nr0[i][j]=1+nr0[i-1][j];
                else
                    nr0[i][j]=0;
            }
        for (int k=1;k<=m;k++)
        {
            for (int j=1;j<=n;j++)
                h[j]=nr0[k][j];
            while (!s.empty())
                s.pop();
            for (int i=1;i<=n;i++) ///putere stanga
            {
                while (!s.empty() && h[s.top()]>=h[i])
                    s.pop();
                if (!s.empty())
                    pst[i]=i-s.top();
                else
                    pst[i]=i;
                s.push(i);
            }
            while (!s.empty())
                s.pop();
            for (int i=n;i>=1;i--) ///putere dreapta
            {
                while (!s.empty() && h[s.top()]>=h[i])
                    s.pop();
                if (!s.empty())
                    pdr[i]=s.top()-i;
                else
                    pdr[i]=n-i+1;
                s.push(i);
            }
            A[q][k]=A[q][k-1];
            for (int i=1;i<=n;i++)
                A[q][k]=max(A[q][k],h[i]*(pst[i]+pdr[i]-1));
        }
        rotate ();
    }

    for (int i=1;i<n;i++)
        rez=max(rez,A[2][i]+A[4][n-i]);
    for (int i=1;i<m;i++)
        rez=max(rez,A[1][i]+A[3][m-i]);
    fout<<rez;
}