• Manacher(马拉车算法)


    //Manacher
    //可求最长回文子串长度 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #define ma 11000005
    using namespace std;
    int n,ans,length[ma<<1];
    //n为字符串长度 length[i]表示以i点为中心端点的回文子串长度+1 
    char a[ma],s[ma<<1];
    void Init()
    {
        s[0]='$';
        for(int i=1;i<=n+1;i++)
        {
            s[2*i-1]='#';
            s[2*i]=a[i-1];
        }
        n=n*2+2;
    }
    void manacher()
    {
        int mxr=0,mid=0;//mxr为目前最长回文子串的右端点 mid为mxr对应回文子串的中点 
        for(int i=1;i<n;i++)
        {
            if(i<mxr)//该点被回文子串包含
                length[i]=min(mxr-i,length[2*mid-i]);
            else
                length[i]=1;
            while(s[i-length[i]]==s[i+length[i]])//扩展 
            {
                length[i]++;
                if(length[i]+i>mxr)
                {
                    mxr=length[i]+i;
                    mid=i;
                }
            }
        } 
    }
    int main()
    {
        scanf("%s",a);
        n=strlen(a);
        Init();
        manacher();
        for(int i=0;i<n;i++)
            ans=max(ans,length[i]);
        printf("%d",ans-1);
        return 0;
    }
  • 相关阅读:
    朋友
    Music
    Rnadom Teams
    Bone Collector(01背包)
    Common Subsequence LCS
    Copying Books
    Equal Sum Sets
    Checker Challenge
    棋盘问题
    油田(Oil Deposits)
  • 原文地址:https://www.cnblogs.com/water-radish/p/9280610.html
Copyright © 2020-2023  润新知