马拉车求最长回文子串

模板:

#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());
    }

}

猜你喜欢

转载自www.cnblogs.com/xbqdsjh/p/12006650.html
今日推荐