結果
問題 |
No.2291 Union Find Estimate
|
ユーザー |
|
提出日時 | 2025-04-15 11:16:56 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 574 ms / 2,000 ms |
コード長 | 1,470 bytes |
コンパイル時間 | 403 ms |
コンパイル使用メモリ | 82,364 KB |
実行使用メモリ | 108,360 KB |
最終ジャッジ日時 | 2025-04-15 11:17:01 |
合計ジャッジ時間 | 4,459 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
ソースコード
import sys sys.setrecursionlimit(10**6) MOD = 998244353 Num = [str(i) for i in range(10)] W,H = map(int,input().split()) A = [-1]*(W+1) T = [[i,1] for i in range(W+1)] def find(x): if T[x][0]==x:return x return find(T[x][0]) def union(x,y): rx = find(x) ry = find(y) if rx==ry:return if T[rx][1]>T[ry][1]: T[ry][0] = rx elif T[rx][1]<T[ry][1]: T[rx][0] = ry else: T[ry][0] = rx T[rx][1] += T[ry][1] ans = 1 for _ in range(H): Q = "-"+input().strip() if ans==0: print(ans) continue C = {} for i in range(1,W+1): if Q[i] in Num: ri = find(i) if A[ri]==-1: A[ri] = int(Q[i]) elif A[ri]!=int(Q[i]): ans = 0 elif Q[i]!="?": if Q[i] not in C: C[Q[i]] = [] C[Q[i]].append(i) for a in C: i = C[a][0] for j in C[a][1:]: ri = find(i) rj = find(j) union(ri,rj) if A[ri]==A[rj]:continue if A[ri]<0 and A[rj]>=0: A[ri] = A[rj] elif A[ri]>=0 and A[rj]<0: A[rj] = A[ri] else: ans = 0 if ans>0: flag = [0]*(W+1) ans = 1 for i in range(1,W+1): ri = find(i) if A[ri]<0 and flag[ri]==0: ans = (ans*10)%MOD flag[ri] = 1 print(ans)