QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#868287#9977. Norte da Universidaderotcar07WA 0ms14100kbC++233.6kb2025-01-24 15:42:422025-01-24 15:42:43

Judging History

你现在查看的是最新测评结果

  • [2025-01-24 15:42:43]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:14100kb
  • [2025-01-24 15:42:42]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e3+5,mod=998244353;
int n,m;
string s[N];
inline void red(int&x){(x>=mod)&&(x-=mod);}
int ul[N][N],ur[N][N],dl[N][N],dr[N][N];
bool l[N][N],r[N][N],d[N][N],u[N][N];
int dp[N],tt[N];
inline void solve(){
    cin>>n>>m;
    s[1]=" "+string(m+2,'N');
    s[n+2]=" "+string(m+2,'S');
    for(int i=2;i<=n+1;i++) cin>>s[i],s[i]=" W"+s[i]+"E";
    n+=2;m+=2;
    for(int i=0;i<=n+1;i++)
    for(int j=0;j<=m+1;j++) l[i][j]=d[i][j]=r[i][j]=u[i][j]=0;
    for(int i=1;i<=n;i++) l[i][0]=r[i][m+1]=1;
    for(int i=1;i<=m;i++) u[0][i]=d[n+1][i]=1;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
        char c=s[i][j];
        l[i][j]=l[i][j-1]&(c=='W'||c=='?');
        u[i][j]=u[i-1][j]&(c=='N'||c=='?');
    }for(int i=n;i>=1;i--)for(int j=m;j>=1;j--){
        char c=s[i][j];
        r[i][j]=r[i][j+1]&(c=='E'||c=='?');
        d[i][j]=d[i+1][j]&(c=='S'||c=='?');
    }
    for(int i=0;i<=n;i++) ul[i][0]=1;
    for(int i=0;i<=m;i++) ul[0][i]=1;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) red(ul[i][j]=ul[i-1][j]*l[i][j]+ul[i][j-1]*u[i][j]);
    for(int i=0;i<=n;i++) ur[i][m]=1;
    for(int i=0;i<=m;i++) ur[0][i]=1;
    for(int i=1;i<=n;i++)
    for(int j=m-1;j>=0;j--) red(ur[i][j]=ur[i-1][j]*r[i][j+1]+ur[i][j+1]*u[i][j+1]);
    for(int i=0;i<=n;i++) dl[i][0]=1;
    for(int i=0;i<=m;i++) dl[n][i]=1;
    for(int i=n-1;i>=0;i--)
    for(int j=1;j<=m;j++) red(dl[i][j]=dl[i+1][j]*l[i+1][j]+dl[i][j-1]*d[i+1][j]);
    for(int i=0;i<=n;i++) dr[i][m]=1;
    for(int i=0;i<=m;i++) dr[n][i]=1;
    for(int i=n-1;i>=0;i--)
    for(int j=m-1;j>=0;j--) red(dr[i][j]=dr[i+1][j]*r[i+1][j+1]+dr[i][j+1]*d[i+1][j+1]);
    long long ans=0;
    memset(dp,0,sizeof dp);
    for(int j=1;j<=m;j++){
        int sum=0;
        for(int i=0;i<=n;i++) tt[i]=(u[i][j]&&d[i+1][j]?dp[i]:0);
        for(int i=1;i<n;i++) if(r[i][j]&&r[i+1][j]) ans+=tt[i]*1ll*ur[i-1][j]%mod*dr[i+1][j]%mod;
        for(int i=0;i<=n;i++){
            red(sum+=tt[i]);
            if(i&&l[i][j]&&d[i+1][j]) red(sum+=ul[i-1][j]*1ll*dl[i][j-1]%mod);
            dp[i]=sum;
            if(i<n&&r[i+1][j+1]&&u[i][j+1]) ans+=ur[i][j+1]*1ll*dr[i+1][j]%mod*sum%mod;
        }sum=0;
        for(int i=n;i>=0;i--){
            if(i<n&&u[i][j]&&l[i+1][j]) red(sum+=ul[i][j-1]*1ll*dl[i+1][j]%mod);
            red(dp[i]+=sum);red(sum+=tt[i]);
            if(i&&r[i][j+1]&&d[i+1][j+1]) ans+=ur[i-1][j]*1ll*dr[i][j+1]%mod*sum%mod;
        }
        for(int i=1;i<n;i++) if(l[i][j]&&l[i+1][j]) red(dp[i]+=ul[i-1][j]*1ll*dl[i+1][j]);
    }
    memset(dp,0,sizeof dp);
    for(int i=1;i<=n;i++){
        int sum=0;
        for(int j=0;j<=m;j++) tt[j]=(l[i][j]&&r[i][j+1]?dp[j]:0);
        for(int j=1;j<m;j++)if(d[i+1][j]&&d[i+1][j+1]) ans+=tt[j]*1ll*dl[i][j-1]%mod*dr[i][j+1]%mod;
        for(int j=0;j<=m;j++){
            red(sum+=tt[j]);
            if(j<m&&l[i+1][j]&&d[i+1][j+1]) ans+=dl[i+1][j]*1ll*dr[i][j+1]%mod*sum%mod;
            if(j&&u[i][j]&&r[i][j+1]) red(sum+=ul[i][j-1]*1ll*ur[i-1][j]%mod);
            dp[j]=sum;
        }sum=0;
        for(int j=m;j>=0;j--){
            if(j&&d[i+1][j]&&r[i+1][j+1]) ans+=dl[i][j-1]*1ll*dr[i+1][j]%mod*(sum+tt[j])%mod;
            if(j<m&&l[i][j]&&u[i][j+1]) red(sum+=ul[i-1][j]*1ll*ur[i][j+1]%mod);
            red(dp[j]+=sum);
            red(sum+=tt[j]);
        }
        for(int j=1;j<m;j++) if(u[i][j]&&u[i][j+1]) red(dp[j]+=ul[i][j-1]*1ll*ur[i][j+1]);
    }
    cout<<ans%mod<<'\n';
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int T;cin>>T;
    while(T--) solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 14100kb

input:

5
11 5
NNNNN
NN???
WW???
WWEEE
WEEEE
WEEEE
WWEEE
WWEE?
SSSSS
?SSS?
??SS?
2 7
??S?N??
??S?N??
3 4
W??E
WEEE
?E??
2 2
??
??
3 3
???
???
???

output:

26
1587
18
56
1112

result:

ok 5 number(s): "26 1587 18 56 1112"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 13964kb

input:

100
4 4
??NN
????
????
S?S?
4 4
????
????
??E?
??S?
4 4
????
??NE
?S?E
S?S?
4 4
WN??
W???
?S??
??S?
4 4
?N??
????
?S??
??S?
4 4
????
W???
????
????
4 4
W???
W?N?
??E?
???E
4 4
??N?
????
W?EE
?S??
4 4
??N?
??N?
?S??
S??E
4 4
????
????
???E
?S?E
4 4
W???
W?N?
W?E?
S???
4 4
WN??
????
????
????
4 4
?N??...

output:

2937
4026
234
876
3354
15949
462
1332
780
5840
147
5496
1192
9733
2842
358
138
498
11856
7287
1182
477
458
96
1696
6949
2123
108
4445
15949
62
90
108
320
1204
856
3082
738
1568
800
88
4934
2953
244
1160
2649
965
360
354
1481
756
4333
477
1268
9736
48
960
1620
3042
3663
892
3100
876
60
5097
954
318
2...

result:

wrong answer 1st numbers differ - expected: '3280', found: '2937'