• 51 Nod 1089 最长回文子串(Manacher算法)


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

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

     收藏

     关注

    回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。

    输入一个字符串Str,输出Str里最长回文子串的长度。

    Input

    输入Str(Str的长度 <= 100000)

    Output

    输出最长回文子串的长度L。

    Input示例

    daabaac

    Output示例

    5
    #include<bits/stdc++.h>
    #include<stdio.h>
    #include<iostream>
    #include<cmath>
    #include<math.h>
    #include<queue>
    #include<set>
    #include<map>
    #include<iomanip>
    #include<algorithm>
    #include<stack>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn=110010;
    char Ma[maxn*2];
    int Mp[maxn*2];
    void Manacher(char s[],int len)
    {
        int l=0;
        Ma[l++]='$';
        Ma[l++]='#';
        for(int i=0;i<len;i++)
        {
            Ma[l++]=s[i];
            Ma[l++]='#';
        }
        Ma[l]=0;
        int mx=0,id=0;
        for(int i=0;i<l;i++)
        {
            Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1;
            while(Ma[i+Mp[i]]==Ma[i-Mp[i]])Mp[i]++;
            if(i+Mp[i]>mx)
            {
                mx=i+Mp[i];
                id=i;
            }
        }
    }
    char s[maxn];
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLIN
        while(scanf("%s",s)==1)
        {
            int len=strlen(s);
            Manacher(s,len);
            int ans=0;
            for(int i=0;i<2*len+2;i++)
                ans=max(ans,Mp[i]-1);
            printf("%d
    ",ans);
        }
        return 0;
    }
    
    
    
    
    
    
  • 相关阅读:
    a*b高精度数组算法
    vscode plugins
    vscode keys
    vscode setting.jsonxx
    vscode settings.json
    webstorm keys
    vscode extensions
    vscode wechat settings.json
    vscode sass live compiler
    webstorm crack
  • 原文地址:https://www.cnblogs.com/linruier/p/9581002.html
Copyright © 2020-2023  润新知