#include<bits/stdc++.h>
using namespace std;
#define ll long long
int T,id,mod = 998244353;
int n,m,c,f;
char a[1005][1005];
int sx[1005][1005],sy[1005][1005];
int cntt[1005][1005];
ll ansc = 0,ansf = 0;
struct ht
{
int x,y,cnt;
}h[1000005];
void solve(int len)
{
for(int i = 1;i <= len;i ++)
{
int x = h[i].x,y = h[i].y;
for(int j = x;j <= h[i].x + h[i].cnt - 1;j ++)
{
if(cntt[j][y])continue;
int cnt = 0,yy = y;
while(sx[j][yy + 1] == sx[j][yy] && yy + 1 <= m)
{
cnt ++;
yy ++;
}
for(int k = 0;k < cnt;k ++)
cntt[j][y + k] = cnt - k;
}
for(int j = x;j <= h[i].x + h[i].cnt - 3;j ++)
{
if(!cntt[j][y])continue;
int bk = cntt[j][y];
for(int jj = j + 2;jj <= h[i].x + h[i].cnt - 1;jj ++)
ansc += (bk * cntt[jj][y]) % mod;
}
for(int j = x;j <= h[i].x + h[i].cnt - 3;j ++)
{
if(!cntt[j][y])continue;
int bk = cntt[j][y];
for(int jj = j + 2;jj <= h[i].x + h[i].cnt - 2;jj ++)
ansf += ((bk * cntt[jj][y]) % mod * (x + h[i].cnt - 1 - jj)) % mod;
}
}
}
int main()
{
cin>>T>>id;
while(T --)
{
ansc = 0;
ansf = 0;
memset(a,0,sizeof a);
memset(sx,0,sizeof sx);
memset(sy,0,sizeof sy);
memset(cntt,0,sizeof cntt);
memset(h,0,sizeof h);
cin>>n>>m>>c>>f;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
cin>>a[i][j],sx[i][j] = sx[i][j - 1] + (a[i][j] - '0'),sy[i][j] = sy[i - 1][j] + (a[i][j] - '0');
int sum = 0;
for(int j = 1;j <= m;j ++)
{
int cnt = 0,i = 1;
while(i < n)
{
int ii = i;
while(i + 1 <= n)
{
i ++;
if(sy[i][j] == sy[i - 1][j])cnt ++;
else break;
}
cnt += !(a[ii][j] - '0');
if(cnt >= 3)
{
h[++sum].x = ii + (a[ii][j] - '0');
h[sum].y = j;
h[sum].cnt = cnt;
}
cnt = 0;
}
}
solve(sum);
cout<<(ansc * c) % mod<<" "<<(ansf * f) % mod<<'\n';
}
return 0;
}
蒟蒻代码可能略有抽象,大佬见谅