根据数据量和题目很容易联想到状态转移dp,且我们容易将状态方程写为
dp[i]+=dp[j] if i&j==0 其中i为当前队列最后一个人的状态
但这样时间复杂度超了,我们需要考虑优化状态,可以将dp数组变为dp[i][j] i表示当前状态的首8位,低八位表示与j没有交集的总方案数,
const int mod = 998244353;
char s[25];
int dp[(1 << 8)][(1 << 8)];
int main() {
int n, m;
scanf("%d %d", &n, &m);
ll ans = 0;
for (int i = 1; i <= n; i++) {
scanf("%s", s + 1);
int a = 0;
for (int j = 1; j <= m; j++) {
a = (a << 1) | (s[j] == 'o');
}
int tmp = 1;
int x = a >> 8, y = a & 255;
for (int k = 0; k < (1 << 8); k++) {
if (!(k & x)) {
(tmp += dp[k][y]) %= mod;
}
}
(ans += tmp) %= mod;
for (int k = 0; k < (1 << 8); k++) {
if (!(k & y)) {
(dp[x][k] += tmp) %= mod;
}
}
}
printf("%lld\n", ans % mod);
return 0;
}