输入一个n*m的矩阵,每个格子可能是空地,也可能是沼泽。对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次。

输入包含多组测试数据,第一行输入一个正整数N,表示输入样例组数(N<=10)
每组测试样例第一行为正整数n和m(1<=n,m<=1000)
以下n行,每行包含m个字符,用'#'表示沼泽,'.'表示土地

输出数据包含多行,用"a x b"来表示周长为b的矩形出现了a次,按照矩形周长从小到大排序

1
6 5
..#.#
.#...
#..##
...#.
#....
#..#.

6 x 4
5 x 6
5 x 8
3 x 10
1 x 12

显而易见,我们要维护一个单调上升的关于每列高度的栈,然而此题仅仅维护高度明显不够,对于一个矩形的边长,我们可有宽度和高度得知。

对于单调栈的每一个元素,我们维护宽度和高度两个元素,为此列的高度和最左端的位置。对于一个矩形,我们有周长=(h+j-c+1)*2,由于对于每一列,j一定,所以h+c最大就是周长最大,因此我们的单调栈不仅要维护长度递增,还要在插入时有所选择,维护h+c的单调递增序列。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct data
{
int x,y;
}sta[];
int n,m;
char a[][];
int h[];
int ans[];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(ans,,sizeof(ans));
memset(h,,sizeof(h));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%s",a[i]+);
for(int i=;i<=n;i++)
{
int head=;
for(int j=;j<=m;j++)
{
int he=h[j],k=j;
if(a[i][j]=='#'){h[j]=;head=;}
else
{
he++;h[j]++;
while(head>=&&sta[head].x>=h[j]){k=sta[head].y;head--;}
if(!head||he-k>sta[head].x-sta[head].y){sta[++head]=(data){he,k};}
ans[sta[head].x+j-sta[head].y+]++;
}
}
}
for(int i=;i<=m+n;i++) if(ans[i]) printf("%d x %d\n",ans[i],i*);
}
}

最新文章

  1. project.pbxproj 的merge问题
  2. 如何启动redis
  3. 通过SecureCRT访问亚马逊Amazon EC2主机
  4. ng-repeat 指令
  5. [转]World Wind学习总结一
  6. (转载)Linux启动过程详解
  7. Red and Black
  8. api文档生成工具 C#
  9. matplotlib 出图示例
  10. tensorflow,object,detection,在model zoom,新下载的模型,WARNING:root:Variable [resnet_v1_50/block1/unit_3/bottleneck_v1/conv3/BatchNorm/gamma] is not available in checkpoint
  11. HDU 1556-Color the ball-树状数组
  12. 拒绝服务(DoS)理解、防御与实现
  13. [Algorithm] Polynomial and FFT
  14. CSS3 transform 属性
  15. IDA 逆向工程 反汇编使用
  16. Maven的依赖管理
  17. 5G的作业- 云计算
  18. 【luogu P3952 时间复杂度】 题解
  19. iOS开发网络缓存原理
  20. 宜信开源微服务任务调度平台(SIA-TASK)

热门文章

  1. Result Maps collection does not contain value for XXXXX
  2. ACE handle_timeout 事件重入
  3. 《数据结构与算法分析:C语言描述》复习——第四章“树”——二叉树
  4. 《算法》C++代码 前言
  5. python学习笔记十七:base64及md5编码
  6. python-线程进程与队列
  7. Leetcode 661.图片平滑器
  8. NodeJs06 高并发
  9. c#用UpdatePanel实现接局部刷新
  10. hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览