sotanishy's competitive programming library

sotanishy's code snippets for competitive programming

View the Project on GitHub sotanishy/cp-library-cpp

:heavy_check_mark: Z Array
(string/z_array.hpp)

Description

Z array は,文字列 SS[i:] の最長共通接頭辞の長さを表す配列である.Z array を求めるアルゴリズムは Z algorithm と呼ばれる.

Z array を用いると文字列中のパターンをすべて検索することができる.文字列を S,パターンを P とし,P$S ($S にも P にも含まれない文字) の Z array を構築すると,値が P の長さと一致するところで P が現れる.

Operations

Reference

Required by

Verified with

Code

#pragma once
#include <string>
#include <vector>

std::vector<int> z_array(const std::string& s) {
    const int n = s.size();
    std::vector<int> z(n);
    z[0] = n;
    int l = 0, r = 0;
    for (int i = 1; i < n; ++i) {
        int k = i - l;
        if (i <= r && z[k] < r - i + 1) {
            z[i] = z[k];
        } else {
            l = i;
            if (i > r) r = i;
            while (r < n && s[r - l] == s[r]) ++r;
            --r;
            z[i] = r - l + 1;
        }
    }
    return z;
}
#line 2 "string/z_array.hpp"
#include <string>
#include <vector>

std::vector<int> z_array(const std::string& s) {
    const int n = s.size();
    std::vector<int> z(n);
    z[0] = n;
    int l = 0, r = 0;
    for (int i = 1; i < n; ++i) {
        int k = i - l;
        if (i <= r && z[k] < r - i + 1) {
            z[i] = z[k];
        } else {
            l = i;
            if (i > r) r = i;
            while (r < n && s[r - l] == s[r]) ++r;
            --r;
            z[i] = r - l + 1;
        }
    }
    return z;
}
Back to top page