Z-function

用更容易理解的方法处理出

s[l…………r]=s[1…………r-l+1]

常数比KMP略大,时间复杂度\(O(n)\)

#include<bits/stdc++.h>
using namespace std;
#define rint register int
const int N=1000005;
char s[N];
int l,r,z[N],n;
int main()
{
    scanf("%s",s);
    l=r=0;
    n=strlen(s);
    z[0]=n;
    for(rint i=1;i<n;++i)
    {
        if(i>r)
        {
            l=r=i;
            while(r<n&&s[r-l]==s[r])++r;
            z[i]=r-l;--r;
        }
        else
        {
            int k=i-l;
            if(z[k]<r-i+1)z[i]=z[k];
            else
            {
                l=i;
                while(r<n&&s[r-l]==s[r])++r;
                z[i]=r-l;--r;
            }
        }
    }
    return 0;
}

这东西也可以做字符串匹配。把模式串接在文本串前面,跑一遍Z-function,找到 \(Z_i \geq lenb\) 的即可

猜你喜欢

转载自www.cnblogs.com/zzctommy/p/12317436.html