#include <cstdio> #include <cstring> #include <algorithm> #define N 1005using namespace Std;const int Inf=1<<30;char mat[n][n];int a[n][n];int l[n],r[n];int main () {int m,n; memset (a,0,sizeof (0)); while (scanf ("%d%d", &m,&n) ==2) {for (int i=1;i<=m;i++) {scanf ("%s", mat[i]+1); for (int j=1;j<=n;j++) {if (mat[i][j]== ' 1 ') a[i][j]=1; else a[i][j]=0; }} for (int i=1;i<=m;i++) {for (int j=1;j<=n;j++) {if (a[i ][j]==1) A[i][j]+=a[i-1][j]; }} int ans=-inf; for (int i=1;i<=m;i++) {sort (a[i]+1,a[i]+1+n); for (int j=1;j<=n;j++) {l[j]=j; while (L[j]>1&&a[i][l[j]-1]>=a[i][j]) l[j]=l[l[j]-1]; }for (int j=n;j>=1;j--) {r[j]=j; while (R[j]<n&&a[i][r[j]+1]>=a[i][j]) r[j]=r[r[j]+1]; } for (int j=1;j<=n;j++) {Ans=max (ans,a[i][j]* (r[j]-l[j]+1)); }} printf ("%d\n", ans); } return 0;}
HDU 2830 Matrix Swapping II (hdu1505 's enhanced version)