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)

参考


戻る