zoukankan      html  css  js  c++  java
  • (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513

    http://acm.hdu.edu.cn/showproblem.php?pid=4513

     

    吉哥系列故事——完美队形II

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 1544    Accepted Submission(s): 577


    Problem Description
      吉哥又想出了一个新的完美队形游戏!
      假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:

      1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的;
      2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意;
      3、从左到中间那个人,身高需保证不下降,如果用H表示新队形的高度,则H[1] <= H[2] <= H[3] .... <= H[mid]。

      现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
     
    Input
      输入数据第一行包含一个整数T,表示总共有T组测试数据(T <= 20);
      每组数据首先是一个整数n(1 <= n <= 100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <= 250,不排除特别矮小和高大的)。
     
    Output
      请输出能组成完美队形的最多人数,每组输出占一行。
     
    Sample Input
    2
    3
    51 52 51
    4
    51 52 52 51
     
    Sample Output
    3
    4
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    #define INF 0x3f3f3f3f
    #define N 2000007
    
    int s[N], S[N], p[N];
    
    int Manacher(int len)
    {
        int MaxLen = 0, index = 0, ans = 0;
    
        for(int i=2; i<len; i++)
        {
            if(MaxLen>i) p[i] = min(p[index*2-i], MaxLen-i);
            else p[i] = 1;
    
            while(s[i-p[i]]==s[i+p[i]] && (s[i-p[i]]==-2 || p[i]==1 || s[i-p[i]]<=s[i-p[i]+2]))
                p[i]++;
    
            if(p[i]+i>MaxLen)
            {
                MaxLen = p[i] + i;
                index = i;
            }
    
            ans = max(ans, p[i]);
        }
        return ans-1;
    }
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--)
        {
            int n, i;
    
            scanf("%d", &n);
            s[0] = INF;
            for(i=0; i<n; i++)
            {
                scanf("%d", &S[i]);
                s[i*2+1] = -2;
                s[i*2+2] = S[i];
            }
            s[i*2+1] = -2;
            s[i*2+2] = -INF;
    
            printf("%d
    ", Manacher(n*2+1));
        }
        return 0;
    }
    View Code
    勿忘初心
  • 相关阅读:
    toj 2819 Travel
    toj 2807 Number Sort
    zoj 2818 Prairie dogs IV
    zoj 1276 Optimal Array Multiplication Sequence
    toj 2802 Tom's Game
    toj 2798 Farey Sequence
    toj 2815 Searching Problem
    toj 2806 Replace Words
    toj 2794 Bus
    css截取字符
  • 原文地址:https://www.cnblogs.com/YY56/p/4853576.html
Copyright © 2011-2022 走看看