Post3

#include <stdio.h>
#define max(a,b) (a>b)?a:b
int sum[100][100];
int inf = 1<<25;
int SUM(int si,int sj,int ei,int ej)
{
    int res = sum[ei][ej];
    if(sj-1>=0)
        res-=sum[ei][sj-1];
    if(si-1>=0)
        res-=sum[si-1][ej];
    if(si-1>=0&&sj-1>=0)
        res+=sum[si-1][sj-1];
    return res;
}
int main()
{
    int i,j,y,x,N,M,m,c;
    char buffer[100];
    scanf("%d",&c);
    getchar();
    getchar();
    while(c--)
    {
        N = 0;
        M = 0;
        while(gets(buffer)&&buffer[0])
        {
            for(M=0;buffer[M];M++)
                sum[N][M]=buffer[M]-'0';
            N++;
        }
        for(i=0;i<N;i++)
            for(j=1;j<M;j++)
                sum[i][j]+=sum[i][j-1];
        for(i=0;i<M;i++)
            for(j=1;j<N;j++)
                sum[j][i]+=sum[j-1][i];
        m = 0;
        for(i=0;i<N;i++)
            for(j=0;j<M;j++)
                for(y=i;y<N;y++)
                    for(x=j;x<M;x++)
                        if(SUM(i,j,y,x)==(y-i+1)*(x-j+1))
                            m = max(m,(y-i+1)*(x-j+1));
        printf("%d\n",m);
        if(c)
            putchar('\n');
    }
    return 0;
}

CODE

#include<bits/stdc++.h>
using namespace std;

int a[105][105],cu[105][105];
int main()
{
    int i,j,k,n,m,d,test;
    cin>>test;
    getchar();
    getchar();
    while(test--)
    {
        i=0;
        while(1)
        {
            i++;
            string s;
            getline(cin,s);
            if(s=="") break;
            n=s.size();
            for(j=0;j<n;j++)
            {
                if(s[j]=='0') a[i][j+1]=-100001;
                else a[i][j+1]=1;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                cu[i][j]=cu[i][j-1]+a[j][i];
        }
        long long max_sum=0,sum;
        for(i=1;i<=n;i++)
        {
            for(j=i;j<=n;j++)
            {
                sum=0;
                for(k=1;k<=n;k++)
                {
                    sum=sum+cu[k][j]-cu[k][i-1];
                    if(sum<0) sum=0;
                    max_sum=max(sum,max_sum);
                }
            }
        }


        long long final_max_sum=max_sum;
        max_sum=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(a[i][j]==0) a[i][j]=1;
                else a[i][j]=-100001;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                cu[i][j]=cu[i][j-1]+a[j][i];
        }
        for(i=1;i<=n;i++)
        {
            for(j=i;j<=n;j++)
            {
                sum=0;
                for(k=1;k<=n;k++)
                {
                    sum=sum+cu[k][j]-cu[k][i-1];
                    if(sum<0) sum=0;
                    max_sum=max(sum,max_sum);
                }
            }
        }
        final_max_sum=max(max_sum,final_max_sum);
        cout<<final_max_sum<<endl;
        if(test) puts("");
    }
    return 0;
}