結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-10 23:55:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 138 ms / 2,000 ms |
| コード長 | 1,474 bytes |
| コンパイル時間 | 355 ms |
| コンパイル使用メモリ | 81,976 KB |
| 実行使用メモリ | 84,608 KB |
| 最終ジャッジ日時 | 2025-09-10 23:55:20 |
| 合計ジャッジ時間 | 3,487 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 14 |
ソースコード
from collections import deque
class AhoCorasick:
def __init__(self, size=26, base='a'):
self.node=[[-1]*size]
self.par=[-1]
self.last=[0]
self.size=size
self.base=ord(base)
self.built=False
def add(self, s: str) -> int:
assert self.built is False
v=0
for c in s:
i=ord(c)-self.base
if self.node[v][i]==-1:
self.node[v][i]=len(self.node)
self.node.append([-1]*self.size)
self.par.append(v)
self.last.append(0)
v = self.node[v][i]
self.last[v] += 1
return v
def build(self) -> None:
assert self.built is False
link=[0]*len(self.node)
q=deque()
for i in range(self.size):
if self.node[0][i]==-1:
self.node[0][i]=0
else:
link[self.node[0][i]]=0
q.append(self.node[0][i])
while q:
v=q.popleft()
self.last[v] += self.last[link[v]]
for i in range(self.size):
u=self.node[v][i]
if u==-1:
self.node[v][i]=self.node[link[v]][i]
else:
link[u]=self.node[link[v]][i]
q.append(u)
self.link=link
self.built=True
S = input()
aho = AhoCorasick(26, 'A')
n = int(input())
A = [input() for _ in range(n)]
for i in range(n):
aho.add(A[i])
aho.build()
u = 0
ans = 0
# print(aho.last)
for i in range(len(S)):
v = ord(S[i])-ord('A')
if aho.node[u][v]==-1:
u = 0
else:
u = aho.node[u][v]
ans += aho.last[u]
# print(i, ans)
print(ans)