結果
問題 | No.2291 Union Find Estimate |
ユーザー |
![]() |
提出日時 | 2023-05-05 22:34:08 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 267 ms / 2,000 ms |
コード長 | 2,523 bytes |
コンパイル時間 | 257 ms |
コンパイル使用メモリ | 82,316 KB |
実行使用メモリ | 88,960 KB |
最終ジャッジ日時 | 2024-11-23 09:36:30 |
合計ジャッジ時間 | 2,974 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
ソースコード
class Unionfind:#根っこ参照で付け直し、デカイ木にちっさい木をつけるdef __init__(self,n):self.parent=[i for i in range(n)]#自分の親頂点の番号self.num=[1]*n#自分を根とする部分木の頂点の個数self.rank=[1]*n#自分を根とする部分木の高さdef find(self,i):if self.parent[i]==i:return ielse:self.parent[i]=self.find(self.parent[i])return self.parent[i]def union(self,i,j):a=self.find(i)b=self.find(j)if self.rank[a]>self.rank[b]:self.parent[b]=aself.num[a]+=self.num[b]elif self.rank[a]<self.rank[b]:self.parent[a]=bself.num[b]+=self.num[a]else:if a!=b:self.rank[a]+=1self.parent[b]=aself.num[a]+=self.num[b]def numb(self,i):#その頂点を含む連結成分の点の個数j=self.find(i)return self.num[j]W,H=map(int,input().split())a=[-1]*WU=Unionfind(W)mod=998244353A=[]for _ in range(H):res=input()if A and A[-1]==0:A.append(0)continueans=1alpha=[[] for _ in range(26)]num=[]for i in range(W):if 48<=ord(res[i])<=57:num.append(i)if 97<=ord(res[i])<=97+25:alpha[ord(res[i])-97].append(i)for i in range(26):l=len(alpha[i])if l!=0:for j in range(l-1):if a[U.find(alpha[i][j])]!=-1 and a[U.find(alpha[i][j+1])]!=-1 and a[U.find(alpha[i][j])]!=a[U.find(alpha[i][j+1])]:ans=0breakaa=U.find(alpha[i][j])bb=U.find(alpha[i][j+1])if aa!=bb:U.union(alpha[i][j],alpha[i][j+1])if a[aa]!=-1 and a[bb]==-1:a[U.find(alpha[i][j])]=a[aa]if a[aa]==-1 and a[bb]!=-1:a[U.find(alpha[i][j])]=a[bb]if ans==0:breakfor i in num:t=int(res[i])if a[U.find(i)]!=-1 and a[U.find(i)]!=t:ans=0breakelif a[U.find(i)]==-1:a[U.find(i)]=tif ans==0:A.append(ans)continuefor i in range(W):if U.find(i)==i and a[U.find(i)]==-1:ans*=10ans%=modA.append(ans)for t in A:print(t)