最长回文子串 V2(Manacher算法)

 回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。

Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Sample Input

daabaac

Sample Output

5
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
using namespace std;
char s[100005],str[300005];
int num;
int len[300005];
void get_str()
{
    str[0]='$';
    int k=1;
    int len=strlen(s);
    for(int i=0;i<len;i++)
    {
        str[k++]='#';
        str[k++]=s[i];
    }
    str[k++]='#';
    num=k;
}
void manacher()
{
    int mx=0,id;
    for(int i=0;i<num;i++)
    {
        if(mx>i)
            len[i]=min(mx-i,len[2*id-i]);
        else
            len[i]=1;
        while(str[i+len[i]]==str[i-len[i]])
            len[i]++;
        if(len[i]+i>mx)
        {
            mx=len[i]+i;
            id=i;
        }
    }
}
int main()
{
    cin>>s;
    get_str();
    manacher();
    int ans=0;
    for(int i=0;i<num;i++)
        if(len[i]>ans)
        ans=len[i];
    cout<<ans-1<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/acagain/p/9180732.html