atcoder#ARC157D. [ARC157D] YY Garden

[ARC157D] YY Garden

配点 : 600600

問題文

HHWW 列のマス目の各マスに X, Y のいずれかの文字が書かれています. 上から ii 行目,左から jj 列目のマスを (i,j)(i, j) で表します. マス目に書かれている文字は HH 個の文字列 S1,S2,,SHS_1, S_2, \dots, S_H によって与えられ,SiS_ijj 文字目がマス (i,j)(i, j) に書かれた文字を表します.

隣り合う各行および各列の間に,マス目全体を横断(縦断)するように柵を設置できます. 柵同士は交差しても構いません. 柵の設置後に,「あるマスから始めて上下左右に隣接するマスへの移動を繰り返すことで,柵を越えずに到達可能なマス全体」を区画と定義します. (出力例 1 の説明も参考にしてください.)

柵の設置方法は全部で 2H1×2W12^{H-1} \times 2^{W-1} 通りありますが,そのうち次の条件を満たすものの個数を 998244353998244353 で割った余りを求めてください.

条件: 各区画には Y が書かれたマスがちょうど 22 個含まれている.

制約

  • 1H20001 \leq H \leq 2000
  • 1W20001 \leq W \leq 2000
  • Si (1iH)S_i \ (1 \leq i \leq H)X, Y からなる長さ WW の文字列である.

入力

入力は以下の形式で標準入力から与えられる.

HH WW

S1S_1

S2S_2

\vdots

SHS_H

出力

条件を満たす柵の設置方法の総数を 998244353998244353 で割った余りを出力せよ.

2 3
XYY
YXY
2

柵の設置方法として,以下の 88 通りがあります.

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

たとえば,2,32, 3 列目の間に柵を設置した場合,区画は

XY
YX
Y
Y

であり,それぞれにちょうど 22 個の Y が含まれているので,条件を満たします.

また,1,21, 2 行目の間と 1,21, 2 列目の間に柵を設置した場合,区画は

X
YY
Y
XY

となり,22 つ目の区画以外にはちょうど 22 個の Y が含まれていないので,条件を満たしません.

2 3
XYX
YYY
0

どのように柵を設置しても条件を満たしません.

2 58
YXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXY
YXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXYXXY
164036797

条件を満たす柵の設置方法の総数を 998244353998244353 で割った余りを出力してください.