#P16090. [Oni2017国家队选拔赛]origami

[Oni2017国家队选拔赛]origami

题目描述

你得到了一张非常大的矩形纸,大小为 N×MN\times M,被划分成 1×11\times 1 的小方格。每个小方格的正反两面都涂有同一种颜色。颜色共有 2626 种,分别用小写英文字母表示。

你想学习折纸。每一步操作如下:

  • 选择一条水平或竖直的折线;
  • 折线必须位于两条相邻行之间,或者两条相邻列之间;
  • 将较小的一半折到较大的一半上;
  • 只有当重叠部分的颜色完全一致时,这次折叠才是合法的。

若折线两侧大小相等,则两种折叠方向都合法。

一次合法折叠示意如下:

每次折叠后,得到的图案仍然可以看作原始矩阵的一个子矩阵。现在问:经过任意次数的合法折叠,或者一次也不折叠,最多可以得到多少种不同的子矩阵?

两个子矩阵被认为不同,当且仅当它们在原始矩阵中的四个角坐标至少有一个不同。

输入格式

第一行包含两个整数 N,MN,M

接下来 NN 行,每行包含一个长度为 MM 的字符串,表示初始纸张颜色矩阵。

输出格式

输出一个正整数 XX,表示可以得到的不同子矩阵数量。

数据范围与约定

  • 1NM1\le N\le M
  • NM1000000N\cdot M\le 1\,000\,000
  • 矩阵中的字符均为小写英文字母。

子任务

子任务 分值 限制
1 10 M10M\le 10
2 30 M40M\le 40
3 50 M600M\le 600,答案 X100000X\le 100\,000
4 70 M1000M\le 1000
5 100 无额外限制

样例 1

输入

5 7
baabbaa
cbbccbb
ababbab
cabccba
bccaacc

输出

2

解释

这是上方示意图中的例子。能够得到的只有原矩阵,以及图中折叠后得到的子矩阵。

样例 2

输入

3 3
zzz
zzz
zzz

输出

36

解释

因为所有格子颜色相同,所以任意子矩阵都可以通过合法折叠得到。