第一次没把last放到for循环里面,只有16pts。避雷
#include<bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
int T, id, n, m, c, f;
long long h[1010][1010], sum[1010][1010];
char mp[1010][1010];
long long ansc, ansf;
/*
1 0
6 6 1 1
000010
011000
000110
010000
011000
000000
*/
int main(){
cin >> T >> id;
while (T --){
ansc = ansf = 0;
memset(h, 0, sizeof(h));
memset(mp, 0, sizeof(mp));
memset(sum, 0, sizeof(sum));
cin >> n >> m >> c >> f;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
cin >> mp[i][j];
for (int i = 1; i <= n; i ++)
for (int j = m; j >= 1; j --){
if (mp[i][j] == '0') h[i][j] = h[i][j + 1] + 1;
else h[i][j] = 0;
}
for (int j = 1; j <= m; j ++){
for (int i = n; i >= 1; i --){
if (h[i][j] >= 2)
sum[i][j] = sum[i + 1][j] + h[i][j] - 1;
else if (h[i][j] != 0) sum[i][j] = sum[i + 1][j];
else sum[i][j] = 0;
}
}
for (int j = 1; j <= m; j ++){
for (int i = 1; i <= n; i ++){
if (h[i][j] >= 2 && mp[i + 1][j] == '0' && mp[i + 2][j] == '0'){
ansc += (h[i][j] - 1) * sum[i + 2][j] % MOD;
ansc %= MOD;
}
}
}
memset(sum, 0, sizeof(sum));
for (int j = 1; j <= m; j ++){
int last = n;
for (int i = n; i >= 1; i --){
if (h[i][j] >= 2)
sum[i][j] = sum[i + 1][j] + (h[i][j] - 1) * (last - i),
sum[i][j] %= MOD;
else if (h[i][j] != 0) sum[i][j] = sum[i + 1][j];
else sum[i][j] = 0, last = i - 1;
}
}
//
// for (int i = 1; i <= n; i ++)
// {
// for (int j = 1; j <= m; j ++)
// cout << sum[i][j] << " ";
// cout << endl;
// }
for (int j = 1; j <= m; j ++){
for (int i = 1; i <= n; i ++){
if (h[i][j] >= 2 && mp[i + 1][j] == '0' && mp[i + 2][j] == '0'){
ansf += (h[i][j] - 1) * sum[i + 2][j] % MOD;
ansf %= MOD;
}
}
}
cout << ansc * c << " " << ansf * f << endl;
}
return 0;
}