扩展KMP

拖了这么久,终于打出扩展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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值