d[i][j]表示str[i][j]为'1'的情况下,第i行以str[i][j]为结尾的连续的最长的1的长度(若str[i][j] == '1')d[i][j] = d[i][j-1] + 1
遍历d[][]的每一列执行操作vis[d[i][j]]++, 求每个长度的个数,遍历完一列后,从后到前执行vis[i-1] += vis[i]
更新ans = max(ans, vis[i]*i)
#include <bits/stdc++.h>
#define maxn 5005
#define MOD 1000000007
typedef long long ll;
using namespace std;
char str[maxn][maxn];
int d[maxn][maxn];
int vis[maxn];
int main() {
// freopen("in.txt", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%s", str[i]+1);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
if(str[i][j] == '1') {
d[i][j] = d[i][j-1] + 1;
}
}
int ans = 0;
for(int i = 1; i <= m; i++){
memset(vis, 0, sizeof(vis));
for(int j = 1; j <= n; j++) {
vis[d[j][i]]++;
}
for(int j = 5000; j >= 1; j--) {
vis[j-1] += vis[j];
ans = max(ans, vis[j] * j);
}
}
printf("%d\n", ans);
return 0;
}