Cod sursa(job #2452120)

Utilizator StanCatalinStanCatalin StanCatalin Data 29 august 2019 17:08:55
Problema DreptPal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("dreptpal.in");
ofstream out("dreptpal.out");

const int dim = 1005;

int n,m,mat[dim][dim],len[dim][2*dim+1],v[2*dim+1],h[dim],stiva[dim],st[dim],dr[dim],vf,maxi = -1,lenmax;

void FaLinie(int x)
{
    int aux = 0;
    v[0] = '$';
    for (int j=1; j<=m; j++)
    {
        v[++aux] = '$';
        v[++aux] = mat[x][j];
    }
    v[++aux] = '$';

    int c = 0,r = 0;

    for (int j=1; j<=2*m+1; j++)
    {
        if (j < r)
        {
            len[x][j] = min(r-j , len[x][2*c-j]);
        }

        while (v[j-len[x][j] - 1] == v[j + len[x][j] + 1])
        {
            len[x][j]++;
        }

        if (j + len[x][j] > r)
        {
            r = j+len[x][j];
            c = j;
        }
    }
}

void MaxDrpt(int col)
{
    for (int i=1; i<=n; i++)
    {
        h[i] = (len[i][2*col]+1)/2;
    }
    vf = 0;
    stiva[vf] = 0;
    for (int i=1; i<=n; i++)
    {
        while (vf > 0 && h[i] <= h[stiva[vf]])
        {
            vf--;
        }
        st[i] = stiva[vf];
        stiva[++vf] = i;
    }

    vf = 0;
    stiva[vf] = n+1;
    for (int i=n; i>=1; i --)
    {
        while (vf > 0 && h[i] < h[stiva[vf]])
        {
            vf--;
        }
        dr[i] = stiva[vf];
        stiva[++vf] = i;
    }

    for (int i=1; i<=n; i++)
    {
        if (maxi < h[i] * (dr[i] - st[i] - 1))
        {
            maxi = h[i] * (dr[i] - st[i] - 1);
            lenmax =  (dr[i] - st[i]-1);
        }
    }
}

int main()
{
    in >> n >> m;
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m; j++)
        {
            in >> mat[i][j];
        }
    }
    for (int i=1; i<=n; i++)
    {
        FaLinie(i);
    }
    for (int j=1; j<=m; j++)
    {
        MaxDrpt(j);
    }
    out << 2*maxi - lenmax;
    return 0;
}