#codethanksfestival14qualah. [code_thanks_festival_14_quala_h]模様替え

[code_thanks_festival_14_quala_h]模様替え

问题描述

进入12月,2014年也即将结束。为了改变心情,我决定更换壁纸来迎接2015年。

我手头有一块长为RR行宽为CC列的布料,我决定从这块布料上切出一部分来做壁纸的设计。

在切割布料的时候,必须沿着格子线切割,并且设计必须是矩形的形状。

布料上的每个格子都被涂上了单一的颜色。

实际上,我每年都追求有趣的设计,所以今年我决定做一个“点对称设计”的图案。

当设计是“点对称设计”时,设设计的大小为HHWW列,

  • 必须满足条件H2H \geq 2W2W \geq 2
  • 对于所有整数i,j(1iH,1jW)i,j (1 \leq i \leq H, 1 \leq j \leq W),设计上第 ii 行从左数第 jj 列的格子的颜色 ci,jc_{i,j} 和设计上第 Hi+1H-i+1 行从左数第 Wj+1W-j+1 列的格子的颜色 cHi+1,Wj+1c_{H-i+1,W-j+1} 相等。

这样的情况称为“点对称设计”。

由于不同位置的布料上可能存在着各种有趣的点,所以即使纵横尺寸和颜色分布完全相同,只要切割的位置不同,就会得到不同的设计。因此,我想知道有多少种方法可以从布料上切割出关于“点对称设计”。


输入

输入以以下格式从标准输入中给出。

RR CC s1s_1 s2s_2 : sRs_R

  • 第一行包含布料的行数 R(1R250)R (1 \leq R \leq 250) 和列数 C(1C250)C (1 \leq C \leq 250),以空格分隔。
  • 接下来的 RR 行包含关于布料配色的信息。其中第 i(1iR)i (1 \leq i \leq R) 行是字符串 sis_i,长度为 CCsis_i 由小写英文字母组成,左起第 j(1jC)j (1 \leq j \leq C) 个字符表示布料上第 ii 行从左数第 jj 列的格子的颜色。
  • 对于不同的两个格子,如果它们上述颜色表示的字符相同,则它们着相同的颜色;如果不同,则着不同的颜色。

部分分

本问题设有部分分。

  • 通过所有满足 R20R \leq 20C20C \leq 20 的数据集1,可以得到15分。
  • 通过所有满足 R100R \leq 100C100C \leq 100 的数据集2,可以在上述基础上再获得30分。
  • 通过没有额外限制的数据集3,可以在上述2个得分基础上再获得55分,总共可以获得100分。

输出

请输出是“点对称设计”的设计数量,以一行结束。输出末尾需包含换行符。


示例1


2 10
codethanks
documentsk

输出示例1


2

布料的配色如下表所示:

c

o

d

e

t

h

a

n

k

s

d

o

c

u

m

e

n

t

s

k

例如,从上往下数第1行第1列的格子为左上角,从上往下数第2行第3列的格子为右下角,在这样的2行3列的区域中切割,

c

o

d

d

o

c

我们将得到“点对称设计”。另外,还可以切割出1个位置,所以答案为2。


示例2


6 4
aaaa
abba
abba
aaaa
ccbb
cdbb

输出示例2


5

即使某个“点对称设计”包含另一个“点对称设计”,我们也要分别计数。

此外,对于这个例子,

b

b

b

b

出现了2次,但我们要计为2个。