zoukankan      html  css  js  c++  java
  • HDU

    1、找出一个最长的回文子串,要求中间的值最大,然后向两侧递减。

    2、判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i]+2]

    3、

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    
    //求最长回文子串
    const int MAXN=100005;
    int Ma[MAXN*2];
    int Mp[MAXN*2];
    
    void Manacher(int s[],int len){
        int l=0;
        Ma[l++]=-1;//标志'$'
        Ma[l++]=255;//标志'#'
        for(int i=0;i<len;i++){
            Ma[l++]=s[i];
            Ma[l++]=255;
        }
        Ma[l]=1;//标志''
        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]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i]+2])Mp[i]++;
            if(i+Mp[i]>mx){
                mx=i+Mp[i];
                id=i;
            }
        }
    }
    /*
    abaaba
    i:    0 1 2 3 4 5 6 7 8 9 10 11 12 13
    Ma[i]:$ # a # b # a # a # b  #  a  #
    Mp[i]:1 1 2 1 4 1 2 7 2 1 4  1  2  1
    */
    
    int s[MAXN];
    int main(){
        int T,n,i;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            for(i=0;i<n;++i)
                scanf("%d",&s[i]);
            Manacher(s,n);
            int ans=0;
            for(i=0;i<2*n+2;++i)
                ans=max(ans,Mp[i]-1);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    web.xml
    ibatis配置
    ibatis基本语法
    XML文件解析
    进制转换
    BaseAction
    【编译】StreamInsight简介
    秒懂C#通过Emit动态生成代码
    百度地图应用开发(二)
    ListView与Adapter的那些事儿
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4940541.html
Copyright © 2011-2022 走看看