結果
| 問題 |
No.2291 Union Find Estimate
|
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2023-05-05 22:15:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 207 ms / 2,000 ms |
| コード長 | 2,586 bytes |
| コンパイル時間 | 656 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 130,644 KB |
| 最終ジャッジ日時 | 2024-11-23 08:31:08 |
| 合計ジャッジ時間 | 3,362 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 |
ソースコード
class UnionFind:
def __init__(self, n):
self.parent = [-1] * n
self.n = n
self.cnt = n
def root(self, x):
if self.parent[x] < 0:
return x
else:
self.parent[x] = self.root(self.parent[x])
return self.parent[x]
def merge(self, x, y):
x = self.root(x)
y = self.root(y)
if x == y:
return False
if self.parent[x] > self.parent[y]:
x, y = y, x
self.parent[x] += self.parent[y]
self.parent[y] = x
self.cnt -= 1
for yy in groups[y]:
groups[x].append(yy)
del groups[y]
return True
def same(self, x, y):
return self.root(x) == self.root(y)
def size(self, x):
return -self.parent[self.root(x)]
def count(self):
return self.cnt
def groups(self):
res = [[] for _ in range(self.n)]
for i in range(self.n):
res[self.root(i)].append(i)
return [group for group in res if group]
w, h = map(int, input().split())
queries = [input() for _ in range(h)]
MOD = 998244353
inv10 = pow(10, MOD - 2, MOD)
ptn = pow(10, w, MOD)
uf = UnionFind(w)
groups = {}
for i in range(w):
groups[i] = [i]
numbers = {}
for i in range(w):
numbers[i] = -1
for query in queries:
before = [-1] * 26
for i, char in enumerate(query):
if char == "?":
continue
if char in '0123456789':
rt = uf.root(i)
if numbers[rt] == -1:
numbers[rt] = int(char)
ptn *= inv10
ptn %= MOD
elif numbers[rt] != int(char):
ptn = 0
else:
val = ord(char) - 97
if before[val] == -1:
before[val] = uf.root(i)
else:
rt0 = uf.root(i)
rt1 = uf.root(before[val])
if rt0 == rt1:
continue
if numbers[rt0] == -1 and numbers[rt1] == -1:
ptn *= inv10
ptn %= MOD
elif numbers[rt0] == -1:
ptn *= inv10
ptn %= MOD
numbers[rt0] = numbers[rt1]
elif numbers[rt1] == -1:
ptn *= inv10
ptn %= MOD
numbers[rt1] = numbers[rt0]
elif numbers[rt0] != numbers[rt1]:
ptn = 0
uf.merge(rt0, rt1)
before[val] = uf.root(rt0)
print(ptn % MOD)
neterukun