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)

参考ページ