记录编号 600540 评测结果 AAAAAAAAAA
题目名称 cake 最终得分 100
用户昵称 Gravatar郑霁桓 是否通过 通过
代码语言 C++ 运行时间 1.772 s
提交时间 2025-05-06 20:12:24 内存使用 50.90 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,b[2000005],f[2000005],ts,t[2000005],ss,M=998244353,pp;
vector<long long>v[2000005];
string s;
int main(){
    freopen("cake.in","r",stdin);
    freopen("cake.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
        cin>>s;
        for(long long j=1;j<=m;j++) if(s[j-1]=='Y') v[i].push_back(j),b[i]++;
    }
    for(long long i=1;i<=n;i++){
        ts=0,f[0]=1;
        for(long long j=1;j<=m;j++) t[j]=0;
        for(long long j=i-1,pp=0;j>=0;j--){
            ts+=b[j+1];
            ss=pp=1;
            for(long long k=0;k<v[j+1].size();k++) t[v[j+1][k]]++;
            if(ts&1||!ts) continue;
            for(long long k=1,tp=0,fp=0;k<=m;k++){
                if(t[k]>2){pp=0; break;}
                if(t[k]==2){
                    if(tp%2){pp=2; break;}
                    if(fp) ss*=(k-fp)%M,ss%=M;
                    tp+=2,fp=k;
                }else if(t[k]){
                    if(tp%2==0&&tp) ss*=(k-fp)%M,ss%=M;
                    tp++,fp=k;
                }
            }
            if(!pp) break;
            if(pp==2) continue; 
            f[i]+=f[j]%M*ss%M;
            f[i]%=M;
        }
    }
    cout<<f[n]%M;
    return 0;
}