Procon

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub K-Yoshizawa/Procon

:warning: Z Algorithm
(Library/String/ZAlgorithm.hpp)

Z Algorithm

文字列 $S$ について、$S$ の $i$ 文字目以降のみを取り出した部分文字列を $S[i]$ とします。

このとき、$0 \le i \lt \lvert S \rvert$ を満たす整数 $i$ に対して、$S$ と $S[i+1]$ の最長共通接頭辞 (Longest Common Prefix) の長さを $\textrm{O}(\lvert S \rvert)$ 時間で求めることができます。

vector<int> ZAlgorithm(string S)

制約

計算量


Depends on

Code

#pragma once

#include "../Common.hpp"

vector<int> ZAlgorithm(string S){
    vector<int> Z(S.size(), 0);
    Z[0] = S.size();
    int i = 1, j = 0;
    while(i < S.size()){
        while(i + j < S.size() && S[j] == S[i + j]) ++j;
        Z[i] = j;
        if(j == 0){
            ++i;
            continue;
        }
        int k = 1;
        while(k < j && k + Z[k] < j){
            Z[i + k] = Z[k];
            ++k;
        }
        i += k;
        j -= k;
    }
    return Z;
}
#line 2 "Library/String/ZAlgorithm.hpp"

#line 2 "Library/Common.hpp"

/**
 * @file Common.hpp
 */

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cstdint>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;

using ll = int64_t;
using ull = uint64_t;

constexpr const ll INF = (1LL << 62) - (3LL << 30) - 1;
#line 4 "Library/String/ZAlgorithm.hpp"

vector<int> ZAlgorithm(string S){
    vector<int> Z(S.size(), 0);
    Z[0] = S.size();
    int i = 1, j = 0;
    while(i < S.size()){
        while(i + j < S.size() && S[j] == S[i + j]) ++j;
        Z[i] = j;
        if(j == 0){
            ++i;
            continue;
        }
        int k = 1;
        while(k < j && k + Z[k] < j){
            Z[i + k] = Z[k];
            ++k;
        }
        i += k;
        j -= k;
    }
    return Z;
}
Back to top page