Z Algorithm

概要

文字列$S$の各位置$i$について,「$S$」と「$S$の$i$文字目以降の文字列」の最長共通接頭辞の長さを求めるアルゴリズム.

計算量

$O(|S|)$

ソースコード

/*Z-Algorithm*/
vector<int> Z_algorithm(string S){
    int N=S.size();
    vector<int> A(N);
    A[0]=N;
    int i=1,j=0;
    while(i<N){
        while(i+j<N&&S[j]==S[i+j])j++;
        A[i]=j;
        if(j==0){
            i++;
            continue;
        }
        int k=1;
        while(i+k<N&&k+A[k]<j){
            A[i+k]=A[k];
            k++;
        }
        i+=k;
        j-=k;
    }
    return A;
};