拖了这么久,终于打出扩展KMP了。
代码并不长,但是细节很多。最好把模板背下来,实在背不下来就根据原理去推。
相比于KMP来说扩展KMP的应用范围更广,更灵活。它的ext[i]与KMP的next[i]的区别就是next[i]表示长度最大的一段s[i-next[i]+1…i]=t[1…next[i]],ext[i]表示s[i…i+ext[i]-1]=t[1…ext[i]]。
其实本人认为EXKMP有很多思想是与manacher相似的,比如记录一个能扩展到的最远的距离,分类讨论等等。
好了,这里就给出模板了。
int k=0,p=0;
memset(nxt,0,sizeof(nxt));
memset(ext,0,sizeof(ext));
nxt[1]=n;
fo(i,2,n)
{
nxt[i]=nxt[i-k+1];
if(i+nxt[i]>p)
{
nxt[i]=max(0,p-i+1);
while(i+nxt[i]<=n && t[nxt[i]+1]==t[i+nxt[i]]) nxt[i]++;
k=i,p=i+nxt[i]-1;
}
}
k=p=0;
fo(i,1,n)
{
ext[i]=nxt[i-k+1];
if(i+ext[i]>p)
{
ext[i]=max(0,p-i+1);
while(ext[i]<n && i+ext[i]<=n && t[ext[i]+1]==s[i+ext[i]]) ext[i]++;
k=i,p=i+ext[i]-1;
}
}