zoukankan      html  css  js  c++  java
  • 51nod 1089 最长回文子串 V2(Manacher算法)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
    输入一个字符串Str,输出Str里最长回文子串的长度。
    Input
    输入Str(Str的长度 <= 100000)
    Output
    输出最长回文子串的长度L。
    Input示例
    daabaac
    Output示例
    5


    马拉车算法

    #include<iostream>
    using namespace std;
    #include<string>
    
    #define min(x, y) ((x)<(y)?(x):(y))
    #define max(x, y) ((x)<(y)?(y):(x))
    string findLongestPalindrome3(string s)
    {
        int length=s.size();
        for(int i=0,k=1;i<length-1;i++)//给字符串添加 #
        {
            s.insert(k,"#");
            k=k+2;
        }
        length=length*2-1;//添加#后字符串长度
        int *rad=new int[length]();
        rad[0]=0;
        for(int i=1,j=1,k;i<length;i=i+k)
        {
            while(i-j>=0&&i+j<length&&s.at(i-j)==s.at(i+j))
                j++;
            rad[i]=j-1;
            for(k=1;k<=rad[i]&&rad[i-k]!=rad[i]-k;k++)//镜像,遇到rad[i-k]=rad[i]-k停止,这时不用从j=1开始比较
                rad[i+k]=min(rad[i-k],rad[i]-k);
    
            j=max(j-k,0);//更新j
    
        }
        int max=0;
        int center;
        for(int i=0;i<length;i++)
        {
            if(rad[i]>max)
            {
                max=rad[i];
                center=i;
            }
        }
        return s.substr(center-max,2*max+1);
    
    }
    
    
    int main()
    {
        string str;
        cin>>str;
        str=findLongestPalindrome3(str);
        int cnt=0;
        for(int i=0;i<str.length();i++)
        {
            if(str[i]!='#')
                cnt++;
        }
        cout<<cnt<<endl;
        return 0;
    }
    




  • 相关阅读:
    RramSim2
    DiskSim
    FTL2
    Durable NAND flash memory management
    node系列:全局与本地
    CSS系列:less备忘
    Sql Server 2008:调试
    JavaScript系列:再巩固-原型链
    移动端 :meta标签1万个作用
    Asp.Net:Repeater 详情 备用
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387130.html
Copyright © 2011-2022 走看看