从民间AC到官方稀烂,这中间到底经历了什么
源代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3 + 5, MOD = 998244353;
int t, n, m, C, F, c, sf, a[N][N], f[N][N], id, now, sum, l[N][N];
char s[N];
signed main(){
scanf("%lld%lld", &t, &id);
while(t --){
c = 0, sf = 0, sum = 0;
scanf("%lld%lld%lld%lld", &n, &m, &C, &F);
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
for(int i = 1; i <= n; i ++){
scanf("%s", s + 1);
for(int j = 1; j <= m; j ++)
a[i][j] = s[j] - '0';
}
for(int i = 1; i <= n; i ++){
for(int j = m; j >= 1; j --)
if(a[i][j] == 0)
f[i][j] = f[i][j + 1] + 1;
else
f[i][j] = 0;
}
for(int j = 1; j <= m; j ++){
for(int i = n; i >= 1; i --)
if(a[i][j] == 0)
l[i][j] = l[i + 1][j] + 1;
else
l[i][j] = 0;
}
for(int j = 1; j <= m; j ++){
sum = 0;
for(int i = 1; i <= n; i ++){
if(a[i][j] == 1){
sum = 0;
continue;
}
now = sum - (max(0ll, f[i - 1][j] - 1));
c = (c + (now * (f[i][j] - 1)) % MOD) % MOD;
sf = (sf + (now * (f[i][j] - 1) * (l[i][j] - 1)) % MOD) % MOD;
sum += f[i][j] - 1;
// printf("***%lld %lld %lld %lld %lld\n", i, j, f[i][j] - 1, sum, now);
}
}
printf("%lld %lld\n", (c * C) % MOD, (sf * F) % MOD);
}
return 0;
}