結果
| 問題 |
No.2291 Union Find Estimate
|
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2023-05-05 22:07:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,583 bytes |
| コンパイル時間 | 279 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 130,396 KB |
| 最終ジャッジ日時 | 2024-11-23 07:56:30 |
| 合計ジャッジ時間 | 3,518 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 WA * 5 |
ソースコード
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:
rt = uf.root(i)
if rt == before[val]:
continue
if numbers[rt] == -1 and numbers[before[val]] == -1:
ptn *= inv10
ptn %= MOD
elif numbers[rt] == -1:
ptn *= inv10
ptn %= MOD
numbers[rt] = numbers[before[val]]
elif numbers[before[val]] == -1:
ptn *= inv10
ptn %= MOD
numbers[before[val]] = numbers[rt]
elif numbers[rt] != numbers[before[val]]:
ptn = 0
uf.merge(before[val], rt)
before[val] = uf.root(i)
print(ptn)
neterukun