#arc157d. [arc157_d]YY Garden

[arc157_d]YY Garden

问题描述

有一个 HHWW 列的网格,每个方格上都写着字符 XY。设 (i,j)(i, j) 表示从上方开始第 ii 行第 jj 列的方格,网格上的字符由 HH 个字符串 S1,S2,,SHS_1, S_2, \dots, S_H 给出:SiS_i 的第 jj 个字符表示方格 (i,j)(i, j) 上的字符。

你可以在相邻的行和列之间设置篱笆,篱笆可以交叉。在设置完篱笆后,从某个方格出发,通过一次次向相邻方格上下左右移动但不能穿越篱笆,可以到达的所有方格构成一个 。(见样例输出1)

共有 2H1times2W12^{H-1} \\times 2^{W-1} 种设置篱笆的方法。求有多少种方法满足以下条件,并输出结果模 998244353998244353

条件: 每个块中恰好有两个方格上写有 Y

约束条件

  • 1H20001 \leq H \leq 2000
  • 1W20001 \leq W \leq 2000
  • Si (1iH)S_i \ (1 \leq i \leq H) 是长度为 WW 的由 XY 构成的字符串。

输入

输入使用以下格式从标准输入给出:

HH WW S1S_1 S2S_2 \vdots SHS_H

输出

输出满足条件的设置篱笆的方法数,结果要模 998244353998244353

样例一

2 3
XYY
YXY

样例一输出

2

以下是八种设置篱笆的方法。

X Y Y    X|Y Y    X Y|Y    X|Y|Y
          |          |      | |
Y X Y    Y|X Y    Y X|Y    Y|X|Y


X Y Y    X|Y Y    X Y|Y    X|Y|Y
-----    -+---    ---+-    -+-+-
Y X Y    Y|X Y    Y X|Y    Y|X|Y

例如,如果在第二列和第三列之间设置了篱笆,得到的块为:

XY
YX
``````plain
Y
Y

每个块中都有恰好两个 Y,所以满足条件。

如果在第一行和第二行之间以及第一列和第二列之间设置了篱笆,得到的块为:

X
``````plain
YY
``````plain
Y
``````plain
XY

除了第二个块外,其它的块中没有恰好两个 Y,所以不满足条件。

样例二

2 3
XYX
YYY

样例二输出

0

没有一种方式可以设置篱笆满足条件。

样例三

2 58
YXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXY
YXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXY

样例三输出

164036797

以模 998244353998244353 的形式输出结果。