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;
}