Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
z_algorithm.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
3
/// @brief Z Algorithm
4
/// @brief `ret[i] = [0, n) と [i, n) の最長共通接頭辞の長さ`
5
template
<
typename
T=
string
>
6
vector
<
int
>
ZAlgorithm
(
const
T& s) {
7
int
n=s.size();
8
vector<
int
> A(n);
for
(
int
i=0; i<n; i++) A[i]=s[i];
9
vector<
int
> ret(n); ret[0]=n;
10
int
i=1,j=0;
11
while
(i<n) {
12
while
(i+j<n && A[j]==A[i+j]) j++;
13
ret[i]=j;
14
if
(j==0) {
15
i++;
16
continue
;
17
}
18
int
k=1;
19
while
(i+k<n && k+ret[k]<j) ret[i+k]=ret[k],++k;
20
i+=k; j-=k;
21
}
22
return
ret;
23
}
ZAlgorithm
vector< int > ZAlgorithm(const T &s)
Z Algorithm
Definition
z_algorithm.hpp:6
string
z_algorithm.hpp
構築:
1.13.2