文件详细信息

下载本文件

本文件的大小为 1087 字节。

#include<algorithm>
#include<cstdio>
const int maxn=2005,maxm=2005;
int n,m;
bool status[maxn][maxm];
bool read(){
	int ch=getchar();
	while(ch!=48&&ch!=49)ch=getchar();
	return ch==49;
}
int left[maxn][maxm],right[maxn][maxm],up[maxn][maxm];
int square,rectangle;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			status[i][j]=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(j>1&&status[i][j-1]!=status[i][j])left[i][j]=left[i][j-1];
			else left[i][j]=j;
	for(int i=1;i<=n;i++)
		for(int j=m;j>=1;j--)
			if(j<m&&status[i][j]!=status[i][j+1])right[i][j]=right[i][j+1];
			else right[i][j]=j;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(i>1&&status[i-1][j]!=status[i][j]){
				left[i][j]=std::max(left[i-1][j],left[i][j]);
				right[i][j]=std::min(right[i-1][j],right[i][j]);
				up[i][j]=up[i-1][j]+1;
			}else up[i][j]=1;
			int len1=right[i][j]-left[i][j]+1,len2=std::min(len1,up[i][j]);
			square=std::max(square,len2*len2);
			rectangle=std::max(rectangle,len1*up[i][j]);
		}
	printf("%d\n%d",square,rectangle);
	return 0;
}