Z 函数(扩展 KMP)

· · 个人记录

定义

实现原理

ll z[maxn]; 
il void Z(string &s){
    ll l=0,r=0; z[0]=s.size();
    ll to=s.size()-1;
    For(i,1,to){
        if(i<=r) z[i]=min(z[i-l],r-i+1);
        while(i+z[i]<=to && s[i+z[i]]==s[z[i]]) ++z[i];
        if(i+z[i]-1>r) r=i+z[i]-1,l=i;
    }
    return;
}

应用

ll z2[maxn];
il void sZ(string &P,string &T){
    Z(P); z[0]=P.size();
    ll l=-1,r=-1,to=T.size()-1,sz=P.size(); 
    For(i,0,to){
        if(i<=r) z2[i]=min(z[i-l],r-i+1);
        while(i+z2[i]<=to && z2[i]<sz && T[i+z2[i]]==P[z2[i]]) ++z2[i];
        if(i+z2[i]-1>r) r=i+z2[i]-1,l=i;
    }
    return;
}

.