Z algorithm
概要
長さ \(N\) の文字列 \(S\) について、各 \(i\) に対し、 \(S\) と \(S[i:|S|-1]\) の最長共通接頭辞を求める。
計算量
\(O(N)\)
実装
def z_algo(S):
N = len(S)
A = [0]*N
i = 1; j = 0
A[0] = l = len(S)
while i < l:
while i+j < l and S[j] == S[i+j]:
j += 1
if not j:
i += 1
continue
A[i] = j
k = 1
while l-i > k < j - A[k]:
A[i+k] = A[k]
k += 1
i += k; j -= k
return A
Verified
-
AtCoder: "AtCoder Regular Contest 060 - F問題: 最良表現 / Best Representation": source (Python3, 891ms)