
cpp
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m=matrix.size(), n=matrix[0].size();
vector<vector<int>> nums(matrix.size(),vector<int>(matrix[0].size()));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0){
nums[i][j]= matrix[i][j]=='1'?1:0;
}else{
nums[i][j]= matrix[i][j]=='1'?nums[i-1][j]+1:0;
}
}
}
for(int i=0;i<m;i++){
nums[i].push_back(-1);
}
int res=0;
for(int i=0;i<m;i++){
stack<int> stk;
for(int j=0;j<=n;j++){
while(!stk.empty()&&nums[i][j]<nums[i][stk.top()]){
int mid=stk.top(); stk.pop();
int left=stk.empty()?-1:stk.top();
int right=j;
res = max(res, nums[i][mid]*(right-left-1));
}
stk.push(j);
}
}
return res;
}
};