結果

問題 No.2291 Union Find Estimate
ユーザー flippergo
提出日時 2025-04-15 09:56:35
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,438 bytes
コンパイル時間 526 ms
コンパイル使用メモリ 82,904 KB
実行使用メモリ 107,984 KB
最終ジャッジ日時 2025-04-15 09:56:40
合計ジャッジ時間 4,444 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 17 WA * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

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]
        ri = find(i)
        for j in C[a][1:]:
            rj = find(j)
            if A[ri]<0 and A[rj]>=0:
                A[ri] = A[rj]
            elif A[ri]>=0 and A[rj]<0:
                A[rj] = A[ri]
            elif A[ri]!=A[rj]:
                ans = 0
            union(ri,rj)
    flag = [0]*(W+1)
    if ans>0:
        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)
0