回文串算法 manacher 代码模板

功能:

在线性时间复杂度内求解以每个字符为中心(奇数)或者偶数符间隙为中心的回文串长度。

p[]中存储每个下标对应的字符为中心的回文串长度
str[]存储塞入添加字符后的字符串
s[]为原始输入字符串

原理可以看此篇博客

#include<bits/stdc++.h>
using namespace std;

const int maxn=3e5;
char s[maxn];
char str[maxn];
int p[maxn],len2,len1;


void init()
{
    len1=strlen(s);
    str[0]='@';
    for(int i=1;i<=2*len1;i+=2)
    {
        str[i]='#';
        str[i+1]=s[i/2];
    }
    str[2*len1+1]='#';
    str[2*len1+2]='$';
    str[2*len1+3]=0;
    len2=2*len1+1;
}

int manacher()
{
     int mx=0,ans=0,po=0;
     for(int i=1;i<=len2;i++)
     {
         if(mx>i)
         p[i]=min(mx-i,p[2*po-i]);
         else
         p[i]=1;
         for(;str[i-p[i]]==str[i+p[i]];p[i]++)
         if(p[i]+i>mx)
         {
             mx=p[i]+i;
             po=i;
         }
         ans=max(ans,p[i]);
     }
     return ans-1;
}

int main()
{
    while(~scanf("%s",s))
    {
        init();
        printf("%d\n",manacher());
    }
    return 0;
}

杭电3068

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值