結果
| 問題 |
No.2838 Diagonals
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-08-11 14:05:08 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 7 ms / 2,000 ms |
| コード長 | 1,565 bytes |
| コンパイル時間 | 1,664 ms |
| コンパイル使用メモリ | 170,844 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-08-11 14:05:11 |
| 合計ジャッジ時間 | 2,770 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
char ch;
int read(){
int x=0,f=0;ch=getchar();
while(!isdigit(ch))f=((ch=='-')?1:0),ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return (f)?-x:x;
}
int ot[40],otp;
void write(int x){
if(!x)return putchar('0'),void();
while(x)ot[++otp]=x%10,x/=10;
while(otp)putchar(ot[otp--]+'0');
return ;
}
const int maxn=5e2+2;
const int mod=998244353;
int n,m;
char s[maxn][maxn];
int ans;
int poi(int i,int j){return (i-1)*m+j;}
struct UFS{
int fa[maxn*maxn],siz[maxn*maxn];
void init(int mx){for(int i=1;i<=mx;i++)fa[i]=i,siz[i]=1;}
int find(int x){return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void merge(int u,int v){
u=find(u),v=find(v);
if(siz[u]>siz[v])swap(u,v);
if(!u||u==v)return ;
fa[u]=v,siz[v]+=siz[u];
return ;
}
}ufs;
void upd(int &x,int v){return ((x+=v)>=mod)?(x-=mod):x,void();}
int main(){
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
n=read(),m=read();
ufs.init(n*m);
for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
ans=1;
for(int i=1;i<=n;i++){
for(int j=1,f1,f2;j<=m;j++){
if(s[i][j]!='#')continue;
f1=((i>1&&s[i-1][j]=='#')?ufs.find(poi(i-1,j)):0);
f2=((j>1&&s[i][j-1]=='#')?ufs.find(poi(i,j-1)):0);
if(!f1||!f2||f1!=f2)ans=4ll*ans%mod;
else ans=2ll*ans%mod;
ufs.merge(f1,poi(i,j));
ufs.merge(f2,poi(i,j));
}
}
write(ans);putchar('\n');
return 0;
}