用更容易理解的方法处理出
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\) 的即可