Manachar算法

今天补题遇到字符串,不太会看了题解发现是manachar算法。(复杂度 O(n))

于是屁颠屁颠跑去补。。。

https://blog.csdn.net/dyx404514/article/details/42061017

这篇介绍的很好,容易理解。

下述个人理解,

这个算法真的是设计的很聪明,对性质的利用非常好,普通的暴力就是遍历匹配,而这种算法巧妙地整合了 奇数回文串与偶数回文串的情况。

 

 

 

板子如下:

int mar(string x)
{
    string s="*";
    int ans=0;
    int lenx=x.length();
    for(int i=0;i<lenx;i++){
        s+='#';
        s+=x[i];
    }
    s+='#';
    int c=0,mx=0,lens=s.length();
    for(int i=0;i<=lens;i++) p[i]=0;
    for(int i=0;i<lens;i++){
        p[i]=mx>i?min(p[2*c-i],mx-i):1;
        while(s[i-p[i]]==s[i+p[i]]) p[i]++;
        if(i+p[i]>mx){
            mx=i+p[i];
            c=i;
        }
        ans=max(ans,p[i]);
    }
    return ans - 1;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值