首页 > 其他 > 详细

马拉车求最长回文子串

时间:2019-12-08 20:45:37      阅读:95      评论:0      收藏:0      [点我收藏+]

模板:

#include<bits/stdc++.h>
using namespace std;
int const N=1e5+5;
char s[N*2],t[N];
int r[N*2];
int change()
{
    int j=2,len=strlen(t);
    s[0]=$;
    s[1]=#;
    for(int i=0; i<len; i++)
    {
        s[j++]=t[i];
        s[j++]=#;
    }
    s[j++]=#;
    return j;
}
int manacher()
{
    memset(r,0,sizeof(r));
    memset(s,0,sizeof(s));
    int len=change(),maxn=1,mid=1,ans=-1,sum=0;
    for(int i=1; i<len; i++)
    {
        if(i<maxn)//i在maxn左边时
        r[i]=min(maxn-i,r[mid*2-i]);
        else
            r[i]=1;
        while(s[i+r[i]]==s[i-r[i]]) r[i]++;
        if(maxn<i+r[i])//更新最大值
        {
            mid=i;//中心为mid
            maxn=i+r[i];//最右边为maxn
        }
        ans=max(ans,r[i]-1);//最长回文子串长度
        sum+=r[i]/2;//回文子串的个数
    }
    return sum;//要啥返回啥

}
int main()
{
    while(scanf("%s",t)!=EOF)
    {
        printf("%d\n",manacher());
    }

}

 

马拉车求最长回文子串

原文:https://www.cnblogs.com/xbqdsjh/p/12006650.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!