样例全过,但 1 pts.
#include <iostream>
#define int long long
using namespace std;
constexpr int N = 1e3 + 5;
constexpr int mod = 998244353;
int T, id, n, m, c, f;
int a[N][N], nxt[N][N];
int line[N][N];
signed main() {
// freopen("plant.in", "r", stdin);
// freopen("plant.out", "w", stdout);
scanf("%d%d", &T, &id);
while (T--) {
scanf("%d%d%d%d", &n, &m, &c, &f);
char ch = getchar();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m + 1; ++j) {
ch = getchar();
a[i][j] = ch - '0';
}
for (int i = 1; i <= n; ++i)
for (int j = m; j >= 1; --j)
if (a[i][j] == 0)
nxt[i][j] = nxt[i][j + 1] + 1;
for (int j = 1; j <= m; ++j)
for (int i = n; i >= 1; --i)
if (a[i][j] == 0)
line[i][j] = line[i + 1][j] + 1;
// cerr << "Time to print NXT" << '\n';
// for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= m; ++j)
// cerr << nxt[i][j] << ' ';
// cerr << '\n';
// }
// cerr << "Time to print LINE" << '\n';
// for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= m; ++j)
// cerr << line[i][j] << ' ';
// cerr << '\n';
// }
int vc = 0, vf = 0;
if (c)
for (int y0 = 1; y0 <= m; ++y0) {
int sum = 0;
// cerr << "Y0 INTOC " << y0 << '\n';
for (int x1 = 3; x1 <= n; ++x1) {
if (nxt[x1 - 2][y0] && nxt[x1 - 1][y0])
sum += nxt[x1 - 2][y0] - 1;
else sum = 0;
// cerr << x1 << ' ' << sum << '\n';
if (nxt[x1][y0]) {
vc += sum * (nxt[x1][y0] - 1);
// cerr << "UPC " << sum * (nxt[x1][y0] - 1) << " ANS " << vc << '\n';
vc %= mod;
}
}
}
if (f)
for (int y0 = 1; y0 <= m; ++y0) {
int sum = 0;
// cerr << "Y0 INTOF " << y0 << '\n';
for (int x1 = 3; x1 <= n; ++x1) {
if (nxt[x1 - 2][y0] && nxt[x1 - 1][y0] && line[x1][y0] > 1)
sum += nxt[x1 - 2][y0] - 1;
else sum = 0;
// cerr << x1 << ' ' << sum << '\n';
if (nxt[x1][y0]) {
vf += sum * (nxt[x1][y0] - 1) * (line[x1][y0] - 1);
// cerr << "UPF " << sum * (nxt[x1][y0] - 1) << " ANS " << vc << '\n';
vf %= mod;
}
}
}
cout << vc * c << ' ' << vf * f << '\n';
}
return 0;
}