以下是我的代码:
#include<iostream>
#include<vector>
using namespace std;
char c[1005][1005];
//long long
long long mod=998244353;
long long m,n;
vector<long long>d[1000005];
vector<long long>e[1000005];
long long dfn[1000005];
long long low[1000005];
long long cnt2=0;
long long cu=0;
long long st[1000005];
long long top=0;
long long fpow(long long a,long long b)
{
if(b==0)
{
return 1;
}
long long tmp=fpow(a,b/2);
long long fans=(tmp*tmp)%mod;
if(b%2==0)
{
return fans;
}
else
{
return (fans*a)%mod;
}
}
long long srh(long long x)
{
low[x]=++cnt2;
dfn[x]=cnt2;
st[++top]=x;
for(long long i=0;i<e[x].size();i++)
{
if(dfn[e[x][i]]==0)
{
low[x]=min(low[x],srh(e[x][i]));
if(low[e[x][i]]>=dfn[x])
{
vector<int>ans;
ans.push_back(x);
d[x].push_back(++cu);
while(true)
{
ans.push_back(st[top]);
d[st[top]].push_back(cu);
if(st[top--]==e[x][i])
{
break;
}
}
}
}
else
{
low[x]=min(low[x],dfn[e[x][i]]);
}
}
return low[x];
}
int main()
{
cin>>m>>n;
long long ans=0;
long long cnt=0;
long long cur=0;
for(long long i=1;i<=m;i++)
{
for(long long j=1;j<=n;j++)
{
cin>>c[i][j];
dfn[i*n+j]=0;
if(c[i][j]=='#')
{
cnt++;
}
}
}
for(long long i=1;i<=m;i++)
{
for(long long j=1;j<=n;j++)
{
if(c[i][j]=='#')
{
long long w=0,x=0,y=0,z=0;
if(j>=2&&c[i][j-1]=='#')
{
e[i*n+j].push_back(i*n+j-1);
}
if(i>=2&&c[i-1][j]=='#')
{
e[i*n+j].push_back(i*n+j-n);
}
if(j<=n-1&&c[i][j+1]=='#')
{
e[i*n+j].push_back(i*n+j+1);
}
if(i<=m-1&&c[i+1][j]=='#')
{
e[i*n+j].push_back(i*n+j+n);
}
}
}
}
for(long long i=1;i<=m;i++)
{
for(long long j=1;j<=n;j++)
{
if(dfn[i*n+j]==0&&c[i][j]=='#')
{
ans++;
srh(i*n+j);
}
}
}
ans=(ans*cnt)%mod;
for(long long i=1;i<=m;i++)
{
for(long long j=1;j<=n;j++)
{
if(c[i][j]=='#')
{
vector<long long>w,x,y,z;
if(j>=2&&c[i][j-1]=='#')
{
w=d[i*n+j-1];
}
if(i>=2&&c[i-1][j]=='#')
{
x=d[i*n+j-n];
}
if(j<=n-1&&c[i][j+1]=='#')
{
y=d[i*n+j+1];
}
if(i<=m-1&&c[i+1][j]=='#')
{
z=d[i*n+j+n];
}
if(w.size()>0)
{
ans++;
}
if(x.size()>0)
{
bool flag=true;
for(long long p=0;p<w.size();p++)
{
for(long long q=0;q<x.size();q++)
{
if(w[p]==x[q])
{
flag=false;
}
}
}
if(flag)
{
ans++;
}
}
if(y.size()>0)
{
bool flag=true;
for(long long p=0;p<w.size();p++)
{
for(long long q=0;q<y.size();q++)
{
if(w[p]==y[q])
{
flag=false;
}
}
}
for(long long p=0;p<x.size();p++)
{
for(long long q=0;q<y.size();q++)
{
if(x[p]==y[q])
{
flag=false;
}
}
}
if(flag)
{
ans++;
}
}
if(z.size()>0)
{
bool flag=true;
for(long long p=0;p<w.size();p++)
{
for(long long q=0;q<z.size();q++)
{
if(w[p]==z[q])
{
flag=false;
}
}
}
for(long long p=0;p<x.size();p++)
{
for(long long q=0;q<z.size();q++)
{
if(x[p]==z[q])
{
flag=false;
}
}
}
for(long long p=0;p<y.size();p++)
{
for(long long q=0;q<z.size();q++)
{
if(y[p]==z[q])
{
flag=false;
}
}
}
if(flag)
{
ans++;
}
}
ans--;
}
}
}
ans=ans%mod;
cout<<(ans*fpow(cnt,mod-2))%mod<<endl;
return 0;
}
好心人悬赏关注,希望你能帮我发现错误,样例都过了!!!