#include <bits/stdc++.h>
using i64 = long long;
#ifdef DEBUG
#include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
#define debug(...) void(23)
#endif
constexpr int inf = int(1E9) + 5;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, M;
std::cin >> N >> M;
std::vector<std::string> A(N);
for (int i = 0; i < N; ++i) {
std::cin >> A[i];
}
int x = M, y = N;
for (int r = 0; r < N; ++r) {
for (int i = 0, j = 0; i < M; i = j) {
if (A[r][i] == '0') {
j++;
} else {
while (j < M && A[r][j] == '1') {
j++;
}
x = std::min(x, j - i);
}
}
}
for (int c = 0; c < M; ++c) {
for (int i = 0, j = 0; i < N; i = j) {
if (A[i][c] == '0') {
j++;
} else {
while (j < N && A[j][c] == '1') {
j++;
}
y = std::min(y, j - i);
}
}
}
debug(x, y);
std::vector<std::vector<int>> lef(N, std::vector<int>(M));
std::vector<std::vector<int>> rig(N, std::vector<int>(M));
for (int r = 0; r < N; ++r) {
for (int i = 0; i < M; ++i) {
if (A[r][i] == '1') {
lef[r][i] = (i ? lef[r][i - 1] : 0) + 1;
}
}
for (int i = M - 1; i >= 0; --i) {
if (A[r][i] == '1') {
rig[r][i] = (i == M - 1 ? 0 : rig[r][i + 1]) + 1;
}
}
}
std::vector<int> mx(N + 1, x);
for (int j = 0; j < M; ++j) {
int len = 0, lo = inf, hi = inf;
for (int i = 0; i < N; ++i) {
if (A[i][j] == '0') {
len = 0;
lo = inf;
hi = inf;
} else {
len++;
lo = std::min(lo, lef[i][j]);
hi = std::min(hi, rig[i][j]);
mx[len] = std::min(mx[len], lo + hi - 1);
}
}
len = 0, lo = inf, hi = inf;
for (int i = N - 1; i >= 0; --i) {
if (A[i][j] == '0') {
len = 0;
lo = inf;
hi = inf;
} else {
len++;
lo = std::min(lo, lef[i][j]);
hi = std::min(hi, rig[i][j]);
mx[len] = std::min(mx[len], lo + hi - 1);
}
}
}
debug(mx);
i64 ans = 0;
for (int i = 1; i <= y; ++i) {
mx[i] = std::min(mx[i], mx[i - 1]);
ans = std::max(ans, 1LL * mx[i] * i);
}
std::cout << ans << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |