#CSPJ1019. 等腰直角三角形(triangle)

等腰直角三角形(triangle)

题目描述

小 Z 学几何学疯了,开始对三角形产生了浓厚的兴趣,因此他想要寻找大量三角形的图片。因为小 Z 是计算机专业出身,所以小 Z 尝试用计算机来帮助他识别图片中的三角形。

为了简化任务,小 Z 特别指出只需要识别直角三角形。具体而言,问题可以描述为:在一个仅由大写字母组成 nnnn 列的字母方阵中,需要找出由不同字母组成的等腰直角三角形的数量,并统计所有等腰直角三角形的总数。

  • 所谓等腰直角三角形,就是有一个角是直角的等腰三角形,或者有两条边相等的直角三角形。
  • 在方阵中,等腰直角三角形只有两种可能的形态:
  1. 直角边与方阵的两条边平行,例如:
AAA B  
AA  BB  
A   BBB
  1. 斜边与方阵的边平行,例如:
B     A  
BB   AAA  
BBB AAAAA  
BB  
B

注意,每个等腰直角三角形至少需要由 33 个字母组成,并且每一个等腰直角三角形中的字母必须都是同一种。

现在,小 Z 想知道方阵中每一种字母组成的等腰直角三角形的个数,以及所有字母组成的等腰直角三角形的总个数。由于小 Z 学疯了,现在没有精力做这个事情,这件事情就委托你来完成了。

输入格式

triangle.in 文件读入数据。

第一行输入一个整数 nn,表示方阵大小。

接下来有 nn 行,每行有 nn 个大写英文字母,描述方阵。

输出格式

输出到 triangle.out 文件。

第一行输出方阵总共有多少个等腰直角三角形,满足等腰直角三角形内部均是同一种字符。

然后对方阵中出现的每个字母,求出由它所组成的等腰直角三角形的个数,并按照字典序顺序各自输出一行。假设方阵中出现了 cntcnt 个字母,就要输出 cntcnt 行,每行先输出字母,然后空两个空格输出仅由该字母组成的等腰直角三角形个数。具体参见样例输出(注意每行字母和个数之间有 22 个空格)。

输入输出样例

3
AAB
ABB
BBC
4
A  1
B  3
C  0

说明/提示

5%5\% 的数据,满足 n4n \le 4​。

10%10\% 的数据,满足 n10n \le 10​。

20%20\% 的数据,满足 n50n \le 50

10%10\% 的数据,满足字母全是 A

50%50\% 的数据,满足 1n1001 \leq n \leq 100

100%100\% 的数据,满足 1n5001 \leq n \leq 500