Cod sursa(job #636771)

Utilizator elfusFlorin Chirica elfus Data 19 noiembrie 2011 23:33:56
Problema DreptPal Scor 40
Compilator cpp Status done
Runda .com 2011 Marime 1.6 kb
#include <stdio.h>

int N, M, x[1024][1024], D[1024][1024];

#define DIM 8192

char ax[DIM+16];
int pz;

inline void cit(int &x) //parsare luata de la blasterz, ms frumos :)
 {
             x=0;
             while(ax[pz]<'0' || ax[pz]>'9')
                         if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
             while(ax[pz]>='0' && ax[pz]<='9')
             {
                         x=x*10+ax[pz]-'0';
                         if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
             }
 }

int check (int i, int j)
{
    int st = j - 1, dr = j + 1, l = 1;
    while (st > 0 && dr <= M)
    {
        if (x[i][st] != x[i][dr])
            return l;
        st --;
        dr ++;
        l += 2;
    }

    return l;
}

int main ()
{
    int i, j, max = 1, k;

    freopen ("dreptpal.in", "r", stdin);
    freopen ("dreptpal.out", "w", stdout);

    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; i ++)
        for (j = 1; j <= M; j ++)
            cit (x[i][j]);
    for (i = 1; i <= N; i ++)
        for (j = 1; j <= M; j ++)
            D[i][j] = check (i, j);

    for (j = 1; j <= M; j ++)
        for (i = 1; i <= N; i ++)
        {
            if (D[i][j] == D[i - 1][j])
                continue;
            if ((N - i + 1) * D[i][j] < max)
                continue;
            for (k = i; k <= N; k ++)
                if (D[k][j] < D[i][j])
                    break;
            if ((k - i) * D[i][j] > max)
                max = (k - i) * D[i][j];
        }
    if (max == N && M > N)
        max = M;
    printf ("%d", max);
    return 0;
}