Cod sursa(job #2009615)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 10 august 2017 10:45:20
Problema DreptPal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<bits/stdc++.h>
#define maxN 1005
using namespace std;
int n,m;
int a[maxN][maxN],odd[maxN][maxN],s[maxN],vf,dr[maxN],st[maxN],k,sol;
int main()
{
    freopen("dreptpal.in","r",stdin);
    freopen("dreptpal.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {
        scanf("%d",&a[i][j]);
    }
    for(int i=1;i<=n;i++)
    {
        int l=0;
        int r=0;
        k=0;
        for(int j=1;j<=m;j++)
        {
            if(j>r) k=0;
            else k=min(odd[i][l+r-j-1],r-j);
            while((j+k)<=m && (j-k)>=1 && a[i][j+k]==a[i][j-k]) k++;
          //  k--;
            odd[i][j]=k;
            k--;
            if((i+k)>r)
            {
                r=i+k;
                l=i-k;
            }
        }
    }
    for(int j=1;j<=m;j++)
    {
        vf=0;
        for(int i=1;i<=n;i++)
        {
            dr[i]=n;
            st[i]=1;
        }
        for(int i=1;i<=n;i++)
        {
            while(vf && odd[s[vf]][j]>odd[i][j])
            {
                dr[s[vf]]=i-1;
                vf--;
            }
            s[++vf]=i;
        }
        vf=0;
        for(int i=n;i>=1;i--)
        {
            while(vf && odd[s[vf]][j]>odd[i][j])
            {
                st[s[vf]]=i+1;
                vf--;
            }
            s[++vf]=i;
        }
        for(int i=1;i<=n;i++)
            sol=max(sol,(2*odd[i][j]-1)*(dr[i]-st[i]+1));
    }
    printf("%d\n",sol);

    return 0;
}