結果
問題 | No.2291 Union Find Estimate |
ユーザー |
![]() |
提出日時 | 2023-05-05 22:07:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 76 ms / 2,000 ms |
コード長 | 2,650 bytes |
コンパイル時間 | 2,300 ms |
コンパイル使用メモリ | 221,336 KB |
最終ジャッジ日時 | 2025-02-12 18:19:49 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
ソースコード
#define rep(i,n) for(int i=0;i<(int)(n);i++)#define ALL(v) v.begin(),v.end()typedef long long ll;#include <bits/stdc++.h>using namespace std;class Dis{public:vector<ll> rank,p,siz;Dis(int s){rank.resize(s,0);p.resize(s,0);siz.resize(s,1);rep(i,s) makeSet(i);}void makeSet(int x){p[x]=x;rank[x]=0;}bool same(int x,int y){return findSet(x)==findSet(y);}void unite(int x,int y){if(same(x,y)) return;link(findSet(x),findSet(y));}void link(int x,int y){if(rank[x]>rank[y]){p[y]=x;siz[x]+=siz[y];}else{p[x]=y;siz[y]+=siz[x];if(rank[x]==rank[y]) rank[y]++;}}int findSet(int x){if(x != p[x]) p[x]=findSet(p[x]);return p[x];}int size(int x){return siz[findSet(x)];}};const int MOD=998244353;ll modpow(ll x,ll n){x%=MOD;ll ans=1;while(n){if(n&1) ans=ans*x%MOD;x=x*x%MOD;n/=2;}return ans;}int main(){ios::sync_with_stdio(false);std::cin.tie(nullptr);ll w,h;cin>>w>>h;Dis ds=Dis(w);const ll r10=modpow(10,MOD-2);ll ans=modpow(10,w);vector<int> A(w,-1);rep(i,h){string s;cin>>s;map<char,set<int>> m;rep(j,w){if(s[j]=='?') continue;else if(s[j]-'0'>=0 && s[j]-'0'<=9){if(A[ds.findSet(j)]!=-1 && A[ds.findSet(j)]!=s[j]-'0') ans=0;else if(A[ds.findSet(j)]!=-1) continue;else{A[ds.findSet(j)]=s[j]-'0';ans=ans*r10%MOD;}}else m[s[j]].insert(j);}for(auto [a,b]:m){if(b.size()<2) continue;int tmp=-1;for(auto x:b){if(tmp==-1) tmp=x;else{if(ds.same(x,tmp)) continue;else{if(A[ds.findSet(x)]!=-1 && A[ds.findSet(tmp)]!=-1 &&A[ds.findSet(x)]!=A[ds.findSet(tmp)]) ans=0;else if(A[ds.findSet(x)]!=-1 && A[ds.findSet(tmp)]!=-1){ds.unite(x,tmp);}else if(A[ds.findSet(x)]==-1 && A[ds.findSet(tmp)]!=-1){int tt=A[ds.findSet(tmp)];ds.unite(x,tmp);A[ds.findSet(tmp)]=tt;ans=ans*r10%MOD;}else if(A[ds.findSet(x)]!=-1 && A[ds.findSet(tmp)]==-1){int tt=A[ds.findSet(x)];ds.unite(x,tmp);A[ds.findSet(tmp)]=tt;ans=ans*r10%MOD;}else{ds.unite(x,tmp);ans=ans*r10%MOD;}}}}}cout<<ans<<'\n';}return 0;}