#include<bits/stdc++.h>
using namespace std;
int T,id,n,m,c,f;
bool a[1005][1005];
char b[1005][1005];
long long csum1=0,csum2=0,csum=0,fsum=0,csumz=0,fx=0;
void youdfs1(int x,int y)
{
int j=y;
while(a[x][j]==1)
{
j++;
if(j-y>=2)
{
csum1++;
csum1%=998244353;
}
}
}
void youdfs2(int x,int y)
{
int j=y;
while(a[x][j]==1)
{
j++;
if(j-y>=2)
{
csum2++;
csum1%=998244353;
}
}
}
void cdfs(int x,int y)
{
int i=x;
youdfs1(x,y);
while(a[i][y]==1)
{
i++;
if(i-x>=3)
{
youdfs2(i-1,y);
csumz=csum1*csum2;
csumz%=998244353;
csum+=csumz;
csum%=998244353;
int k=i-1;
while(a[k][y]==1)
{
k++;
if(k-i>=1)
fx++;
}
fsum+=fx*csumz;
fsum%=998244353;
fx=0;
}
csum2=0;
}
csum1=0;
}
int main()
{
//freopen("plant.in","r",stdin);
//freopen("plant.out","w",stdout);
cin>>T>>id;
for(int diedai=1;diedai<=T;diedai++)
{
cin>>n>>m>>c>>f;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>b[i][j];
if(b[i][j]=='0') a[i][j]=1;
else a[i][j]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==1) cdfs(i,j);
cout<<c*csum<<" "<<f*fsum<<endl;
csum=0;
fsum=0;
}
return 0;
}
算时间复杂度的时候脑子炸了,现在我都不知道我写的是啥了……洛谷数据只有两个点TLE,INFOJ就变成除了前两个点全炸了(甚至比T4的纯暴力还要低)