三个样例都对,不知道为什么一交就WA
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5, M = 998244353;
typedef long long ll;
int t, id;
int n, m, c, f, a[N][N], row[N][N], col[N][N];
ll sumr[N][N];
void init() {
memset(sumr, 0, sizeof sumr);
memset(row, 0, sizeof row);
memset(col, 0, sizeof col);
}
ll mc() {
if(c == 0) return 0;
ll ans = 0;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j) {
if(col[i][j]<3 || row[i][j]<2) continue;
ans = (ans + (sumr[i+col[i][j]-1][j]-sumr[i+1][j]-col[i][j]+2)*(row[i][j]-1))%M;
}
return ans;
}
ll mf() {
if(f == 0) return 0;
ll ans = 0;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j) {
if(col[i][j]<4 || row[i][j]<2) continue;
ans = (ans + (sumr[i+col[i][j]-2][j]-sumr[i+1][j]-col[i][j]+3)*(row[i][j]-1)*(col[i][j]-3))%M;
}
return ans;
}
void solve() {
init();
scanf("%d%d%d%d", &n, &m, &c, &f);
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
scanf("%1d", &a[i][j]);
int last = 0;
for(int i = 1;i <= n;++i, last = 0) {
for(int j = m;j >= 1;--j) {
if(a[i][j]) last = 0;
else row[i][j] = ++last;
}
}
for(int j = 1;j <= m;++j)
for(int i = 1;i <= n;++i)
sumr[i][j] = sumr[i-1][j]+row[i][j];
for(int j = 1;j <= m;++j, last = 0)
for(int i = n;i >= 1;--i) {
if(a[i][j]) last = 0;
else col[i][j] = ++last;
}
printf("%lld %lld\n", mc(), mf());
}
int main () {
scanf("%d%d", &t, &id);
while(t--) solve();
return 0;
}