結果
| 問題 | No.3234 Infinite Propagation |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-19 10:15:15 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 3,113 bytes |
| 記録 | |
| コンパイル時間 | 279 ms |
| コンパイル使用メモリ | 85,120 KB |
| 実行使用メモリ | 739,020 KB |
| 最終ジャッジ日時 | 2026-05-19 10:15:40 |
| 合計ジャッジ時間 | 8,113 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 8 MLE * 1 -- * 9 |
ソースコード
from collections import deque
class AhoCorasick:
def __init__(self):
self.next = [dict()]
self.fail = [0]
self.out = [[]]
def add(self, pattern: str, pattern_id: int) -> None:
v = 0
for ch in pattern:
if ch not in self.next[v]:
new_node = len(self.next)
self.next[v][ch] = new_node
self.next.append(dict())
self.fail.append(0)
self.out.append([])
v = self.next[v][ch]
self.out[v].append(pattern_id)
def build(self) -> None:
q = deque()
for ch, u in self.next[0].items():
self.fail[u] = 0
q.append(u)
while q:
v = q.popleft()
self.out[v].extend(self.out[self.fail[v]])
for ch, u in self.next[v].items():
f = self.fail[v]
while f != 0 and ch not in self.next[f]:
f = self.fail[f]
if ch in self.next[f]:
self.fail[u] = self.next[f][ch]
else:
self.fail[u] = 0
q.append(u)
def search(self, text: str):
v = 0
result = []
for pos, ch in enumerate(text):
while v != 0 and ch not in self.next[v]:
v = self.fail[v]
if ch in self.next[v]:
v = self.next[v][ch]
else:
v = 0
for pattern_id in self.out[v]:
result.append((pos, pattern_id))
return result
T = int(input())
for _ in range(T):
N = int(input())
patterns = []
texts = []
for _ in range(N):
x,y = input().split()
patterns.append(x)
texts.append(y)
if "a" not in patterns:
print("No")
else:
ac = AhoCorasick()
for i,p in enumerate(patterns):
ac.add(p, i)
ac.build()
G = {i:[] for i in range(N)}
for i,t in enumerate(texts):
matches = ac.search(t)
for end_pos, pattern_id in matches:
G[i].append(pattern_id)
que = deque()
A = set()
for i,pattern in enumerate(patterns):
if pattern == "a":
que.append(i)
A.add(i)
while que:
u = que.popleft()
for v in G[u]:
if v not in A:
A.add(v)
que.append(v)
F = {i:[] for i in range(N)}
B = {i:0 for i in A}
for i in A:
for v in G[i]:
if v in A:
F[i].append(v)
B[v] += 1
que = deque()
for v in B:
if B[v] == 0:
que.append(v)
while que:
u = que.popleft()
for v in F[u]:
B[v] -= 1
if B[v] == 0:
que.append(v)
flag = 0
for v in B:
flag += B[v]
if flag==0:
print("No")
else:
print("Yes")