板子:马拉车算法、回文树

两个处理回文串的利器。

马拉车可以求出每个字符为中心的最长回文串。

回文树可以统计本质不同的回文串数量以及每个回文串的个数,以下标i结尾的回文串个数。

马拉车

原理

首先在第一个位置插入一个’$’防止溢出,然后再所有字符之间插入’#’来处理奇偶回文串的问题。

大概原理就是如过当前回文串最右端包括了当前区间,那么就可以通过对称点得到一个初始值,如果不在初始值就为1。

然后暴力匹配即可。

最终算出的P数组代表以某个字符串为中心的半径,回文串的长度就是pi-1

时间啊复杂制度是O(n)的,因为每次暴力匹配只会匹配从未匹配的点。

代码

void manacher(char *s,int n)
{
    int mx=0,id=0;
    for(int i=1;i<=n;i++)
    {
        p[i]=(mx>i)?min(p[2*id-i],mx-i):1;
        while(s[i-p[i]]==s[i+p[i]])p[i]++;
        if(i+p[i]>mx)
        {
            mx=p[i]+i;
            id<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值