比赛 2025.5.5 评测结果 WTTTTTTTTT
题目名称 cake 最终得分 0
用户昵称 健康铀 运行时间 18.002 s
代码语言 C++ 内存使用 24.77 MiB
提交时间 2025-05-05 11:54:34
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;

int main() {
		freopen("cake.in","r",stdin);
		freopen("cake.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<string> g(N);
    for (int i = 0; i < N; ++i) {
        cin >> g[i];
    }

    vector<vector<int>> c(N, vector<int>(M));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            c[i][j] = (g[i][j] == 'Y') ? 1 : 0;
        }
    }

    vector<vector<int>> p(N, vector<int>(M + 1));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            p[i][j + 1] = p[i][j] + c[i][j];
        }
    }

    auto f = [&](int a, int b, int col) {
        int s = 0;
        for (int i = a; i < b; ++i) {
            s += c[i][col];
        }
        return s;
    };

    vector<int> dp(N + 1);
    dp[0] = 1;
    for (int i = 1; i <= N; ++i) {
        for (int j = i - 1; j >= 0; --j) {
            bool ok = true;
            int t = 0;
            vector<int> cs(M);
            for (int k = 0; k < M; ++k) {
                cs[k] = f(j, i, k);
                t += cs[k];
            }
            if (t % 2 != 0) {
                ok = false;
            } else {
                int cs_sum = 0;
                for (int k = 0; k < M; ++k) {
                    cs_sum += cs[k];
                    if (cs_sum > 2) {
                        ok = false;
                        break;
                    }
                    if (cs_sum == 2) {
                        cs_sum = 0;
                    }
                }
                if (cs_sum != 0) {
                    ok = false;
                }
            }
            if (ok) {
                dp[i] = (dp[i] + dp[j]) % MOD;
            }
        }
    }

    cout << dp[N] << '\n';
    return 0;
}