Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
class Solution {
public:
vector<vector<int> > lreach,upreach,rreach;
void set_reach(vector<vector<char> > &matrix)
{
vector<int> v;
for(int r = 0; r < matrix.size(); ++r)
{
if(matrix[r][0] == '1')v.push_back(1);
else v.push_back(0);
for(int c = 1; c < matrix[r].size(); ++c)
{
if(matrix[r][c] == '0')v.push_back(0);
if(matrix[r][c] == '1' && matrix[r][c - 1] == '1')v.push_back(v[c - 1] + 1);
if(matrix[r][c] == '1' && matrix[r][c - 1] == '0')v.push_back(1);
}
lreach.push_back(v);
v.clear();
}
for(int r = 0; r < matrix.size(); ++r)
{
vector<int> v;
int rsize = matrix[0].size();
if(matrix[r][rsize - 1] == '1')v.push_back(1);
else v.push_back(0);
for(int c = rsize - 2; c >= 0; --c)
{
if(matrix[r][c] == '0')v.push_back(0);
if(matrix[r][c] == '1' && matrix[r][c + 1] == '1')v.push_back(v[v.size() - 1] + 1);
if(matrix[r][c] == '1' && matrix[r][c + 1] == '0')v.push_back(1);
}
reverse(v.begin(), v.end());
rreach.push_back(v);
v.clear();
}
for(int c = 0; c < matrix[0].size(); ++c)
{
if(matrix[0][c] == '1')v.push_back(1);
else v.push_back(0);
for(int r = 1; r < matrix.size(); ++r)
{
if(matrix[r][c] == '0')v.push_back(0);
if(matrix[r][c] == '1' && matrix[r - 1][c] == '1')v.push_back(v[r - 1] + 1);
if(matrix[r][c] == '1' && matrix[r - 1][c] == '0') v.push_back(1);
}
upreach.push_back(v);
v.clear();
}
}
int maximalRectangle(vector<vector<char> > &matrix) {
if(!matrix.size())return 0;
set_reach(matrix);
int rtv = 0;
int l,rt,up;
for(int r = 0; r < matrix.size(); ++r)
{
for(int c = 0; c < matrix[r].size(); ++c)
{
up = upreach[c][r];
if(!up)l = rt= 0;
else
{
l = lreach[r][c];
rt = rreach[r][c];
for(int i = 1; i <= up ; ++i)
{
l = min(l, lreach[r - i + 1][c]);
rt = min(rt, rreach[r - i + 1][c]);
}
}
rtv = max(rtv, up * (l + rt - 1));
}
}
return rtv;
}
};