voiddickdreamer(){ std::cin >> n >> m; a.resize(n + 2), b.resize(n + 2); for (int i = 1; i <= n + m; ++i) G[i].clear(); for (int i = 1; i <= n; ++i) { std::cin >> s[i]; s[i] = " " + s[i]; } for (int i = 1; i <= n + 1; ++i) a[i].resize(m + 2), b[i].resize(m + 2); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m + 1; ++j) { if (j == 1) a[i][j] = 0; else a[i][j] = a[i][j - 1] ^ (s[i][j - 1] == 'A'); } if (a[i][m + 1]) returnvoid(std::cout << "0\n"); } for (int j = 1; j <= m; ++j) { for (int i = 1; i <= n + 1; ++i) { if (i == 1) b[i][j] = 0; else b[i][j] = b[i - 1][j] ^ (s[i - 1][j] == 'A'); } if (b[n + 1][j]) returnvoid(std::cout << "0\n"); } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (s[i][j] == 'B') { int v = 1 ^ a[i][j] ^ b[i][j]; G[i].emplace_back(j + n, v), G[j + n].emplace_back(i, v); } } } std::fill_n(col + 1, n + m, -1); int ans = 1; fl = 1; for (int i = 1; i <= n + m; ++i) { if (!~col[i]) { col[i] = 0, dfs(i); if (!fl) returnvoid(std::cout << "0\n"); ans = 2ll * ans % kMod; } } std::cout << ans << '\n'; }