Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
z_algorithm.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3/// @brief Z Algorithm
4/// @brief `ret[i] = [0, n) と [i, n) の最長共通接頭辞の長さ`
5template<typename T=string>
6vector<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}
vector< int > ZAlgorithm(const T &s)
Z Algorithm