#pragma once
template<typenameContainer>vector<int>z_algorithm(constContainer&s){intn=s.size();if(n==0)return{};vector<int>a(n);a[0]=n;inti=1,j=0;while(i<n){while(i+j<n&&s[j]==s[i+j])j++;a[i]=j;if(j==0){i++;continue;}intk=1;while(i+k<n&&k+a[k]<j)a[i+k]=a[k],k++;i+=k,j-=k;}returna;}/**
* @brief Z algorithm
*/
#line 2 "string/z-algorithm.hpp"
template<typenameContainer>vector<int>z_algorithm(constContainer&s){intn=s.size();if(n==0)return{};vector<int>a(n);a[0]=n;inti=1,j=0;while(i<n){while(i+j<n&&s[j]==s[i+j])j++;a[i]=j;if(j==0){i++;continue;}intk=1;while(i+k<n&&k+a[k]<j)a[i+k]=a[k],k++;i+=k,j-=k;}returna;}/**
* @brief Z algorithm
*/