Pagini recente » Cod sursa (job #3130861) | Cod sursa (job #207229) | Cod sursa (job #4633) | Cod sursa (job #2237398) | Cod sursa (job #2840624)
#include <bits/stdc++.h>
using namespace std;
inline void Open(const string Name) {
#ifndef ONLINE_JUDGE
(void)!freopen((Name + ".in").c_str(), "r", stdin);
(void)!freopen((Name + ".out").c_str(), "w", stdout);
#endif
}
char a[201][202], aux[202][202];
int up[201], down[201], l[201], r[201], dp[202];
int N, M;
void mxArea(int &ans) {
stack <int> st;
st.push(0);
for(int i = 1;i <= M + 1;i++) {
while(st.size() != 1 && dp[i] <= dp[st.top()]) {
int top = st.top();
st.pop();
ans = max(ans, dp[top] * (i - st.top() - 1));
}
st.push(i);
}
}
void RotateMatrix() {
for(int i = 1;i <= N;i++)
for(int j = 1;j <= M;j++)
aux[j][N - i + 1] = a[i][j];
swap(N, M);
memcpy(a, aux, sizeof(aux));
}
void solve(int Task) {
memset(dp, 0, sizeof(dp));
for(int i = 1;i <= N;i++) {
for(int j = 1;j <= M;j++)
dp[j] += (a[i][j] == '1'? -dp[j] : 1);
if(Task == 4) {
mxArea(up[i]);
up[i] = max(up[i], up[i - 1]);
continue;
}
if(Task == 3) {
mxArea(l[i]);
l[i] = max(l[i - 1], l[i]);
continue;
}
if(Task == 2) {
mxArea(down[i]);
down[i] = max(down[i - 1], down[i]);
continue;
}
mxArea(r[i]);
r[i] = max(r[i - 1], r[i]);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
Open("bmatrix");
cin >> N >> M;
for(int i = 1;i <= N;i++)
cin >> (a[i] + 1);
int T = 4;
for(;T;T--) {
solve(T);
RotateMatrix();
}
int ans = 0;
for(int i = 1;i <= N;i++)
ans = max(ans, up[i] + down[N - i]);
for(int i = 1;i <= M;i++)
ans = max(ans, l[i] + r[M - i]);
cout << ans;
return 0;
}