#include #include #include #include #include #include int main() { int32_t r, c, s, t; std::cin >> r >> c >> s >> t; std::vector grid(r); // adding a right column simplifies the stack logic for (auto& row : grid) { std::cin >> row; row.push_back('0'); } ++c; std::vector> rowSum(r, std::vector(c, 0)); for (int32_t i = 0; i < r; ++i) { rowSum[i][0] = grid[i][0] == '.'; for (int32_t j = 1; j < c; ++j) { rowSum[i][j] = grid[i][j] == '.' ? rowSum[i][j - 1] + 1 : 0; } } std::vector> colSum(r, std::vector(c, 0)); for (int32_t j = 0; j < c; ++j) { colSum[0][j] = grid[0][j] == '.'; } for (int32_t i = 1; i < r; ++i) { for (int32_t j = 0; j < c; ++j) { colSum[i][j] = grid[i][j] == '.' ? 1 + colSum[i - 1][j] : 0; } } auto check = [s, t](int32_t curW, int32_t curH) -> bool { return (curW >= s && curH >= t) || (curW >= t && curH >= s); }; int64_t ans = 0; for (int32_t i = 0; i < r; ++i) { std::vector> stk; for (int32_t j = 0; j < c; ++j) { int32_t src = j; while (!stk.empty() && stk.back()[1] > colSum[i][j]) { auto [l, curH] = stk.back(); stk.pop_back(); int32_t curW = j - l; ans += check(curW, curH) && (i + 1 == r || rowSum[i + 1][j - 1] < curW); src = l; } if (colSum[i][j] && (stk.empty() || colSum[i][j] > stk.back()[1])) stk.push_back({src, colSum[i][j]}); } } std::cout << ans << '\n'; return 0; }