sotanishy's code snippets for competitive programming
#include "string/z_array.hpp"
Z array は,文字列 S
と S[i:]
の最長共通接頭辞の長さを表す配列である.Z array を求めるアルゴリズムは Z algorithm と呼ばれる.
Z array を用いると文字列中のパターンをすべて検索することができる.文字列を S
,パターンを P
とし,P$S
($
は S
にも P
にも含まれない文字) の Z array を構築すると,値が P
の長さと一致するところで P
が現れる.
vector<int> z_array(string s)
#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;
}