#P16090. [Oni2017国家队选拔赛]origami
[Oni2017国家队选拔赛]origami
题目描述
你得到了一张非常大的矩形纸,大小为 ,被划分成 的小方格。每个小方格的正反两面都涂有同一种颜色。颜色共有 种,分别用小写英文字母表示。
你想学习折纸。每一步操作如下:
- 选择一条水平或竖直的折线;
- 折线必须位于两条相邻行之间,或者两条相邻列之间;
- 将较小的一半折到较大的一半上;
- 只有当重叠部分的颜色完全一致时,这次折叠才是合法的。
若折线两侧大小相等,则两种折叠方向都合法。
一次合法折叠示意如下:

每次折叠后,得到的图案仍然可以看作原始矩阵的一个子矩阵。现在问:经过任意次数的合法折叠,或者一次也不折叠,最多可以得到多少种不同的子矩阵?
两个子矩阵被认为不同,当且仅当它们在原始矩阵中的四个角坐标至少有一个不同。
输入格式
第一行包含两个整数 。
接下来 行,每行包含一个长度为 的字符串,表示初始纸张颜色矩阵。
输出格式
输出一个正整数 ,表示可以得到的不同子矩阵数量。
数据范围与约定
- ;
- ;
- 矩阵中的字符均为小写英文字母。
子任务
| 子任务 | 分值 | 限制 |
|---|---|---|
| 1 | 10 | |
| 2 | 30 | |
| 3 | 50 | ,答案 |
| 4 | 70 | |
| 5 | 100 | 无额外限制 |
样例 1
输入
5 7
baabbaa
cbbccbb
ababbab
cabccba
bccaacc
输出
2
解释
这是上方示意图中的例子。能够得到的只有原矩阵,以及图中折叠后得到的子矩阵。
样例 2
输入
3 3
zzz
zzz
zzz
输出
36
解释
因为所有格子颜色相同,所以任意子矩阵都可以通过合法折叠得到。