AT_joi2011yo_f JOI 旗 (JOI Flag)

题目描述

日本信息奥林匹克委员会为了宣传今年的日本信息奥林匹克(JOI),计划制作一种以 JOI 字母为主题的旗帜。这种旗帜需要设计成「好的旗帜」。所谓「好的旗帜」,是指由字母 J、O、I 组成的 $M$ 行 $N$ 列的矩形排列,并且至少有一个区域满足下图所示的排列:J 的右边是 O,而 J 的下面是 I。 以下展示了两个「好的旗帜」的示例: ![2011-yo-t6-fig02.png](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_joi2011yo_f/87fb8ec8b7959c37b5142d7ab6abc6a6c8a8477f.png) 反之,下图中的两个则不是「好的旗帜」: ![2011-yo-t6-fig03.png](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_joi2011yo_f/36ddacc7ae97b082eee44eaf45f99ad0f8e96e46.png) 现在,你需要根据已知的 $M$ 和 $N$ 值,以及部分确定为 J、O、I 的位置,来计算所有可能的「好的旗帜」的总数。请输出这些「好的旗帜」数量对 $100\,000\ (=\ 10^5)$ 取模的结果。

输入格式

输入包括 $1 + M$ 行。 第 $1$ 行包含两个整数 $M$ 和 $N$ ($2 \leq M \leq 20$,$2 \leq N \leq 20$),表示旗帜的行数和列数。 接下来的 $M$ 行,每行是一个长度为 $N$ 的字符串,其中每个字符可以是 J、O、I 或 ?。若某位置为 J、O 或 I,则表示此位置的字母已确定;若为 ?,则表示此位置的字母尚未确定。

输出格式

输出一个整数,表示所有可能的「好的旗帜」数量对 $100\,000\ (=\ 10^5)$ 取模的结果。

说明/提示

### 样例解释 1 在样例1中,有以下四种「好的旗帜」的可能性: ![2011-yo-t6-fig04.png](https://img.atcoder.jp/joi2011yo/2011-yo-t6-fig04.png) ### 样例解释 4 在样例4中,总共有 $2\,428\,218$ 种「好的旗帜」,所以需要输出它对 $100\,000\ (=\ 10^5)$ 取模后的结果 $28\,218$。 **本翻译由 AI 自动生成**