• HDU 4513 吉哥系列故事――完美队形II(Manacher算法)


     吉哥又想出了一个新的完美队形游戏!
      假设有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);

    Output
      请输出能组成完美队形的最多人数,每组输出占一行。
      
    Sample Input

    2
    3
    51 52 51
    4
    51 52 52 51
    

    Sample Output

    3
    4
    

    思路:
    Manacher算法。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    int board[200005];
    int p[200005];
    
    int Manacher(int length){
        int id;
        int mx = 0;
        int Max_len = 0;
        for(int i=0 ; i<length ; i++){
            if(i<mx){
                p[i] = min(p[id*2-i],mx-i);
            }
            else p[i] = 1;
    
            while(board[i-p[i]] == board[i+p[i]] && board[i-p[i]]<=board[i-p[i]+2])p[i]++;
    
            if(i+p[i]>mx){
                mx = i+p[i];
                id = i;
            }
            Max_len = max(p[i]-1,Max_len);
        }
        return Max_len;
    }
    
    int main(){
        int T;
        cin>>T;
        int N;
        while(T--){
            scanf("%d",&N);
            board[0] = 0;
            board[1] = 1;
            int flag = 2;
            for(int i=0 ; i<N ; i++){
                scanf("%d",&board[flag++]);
                board[flag++] = 1;
            }
            board[flag++] = -1;
            printf("%d
    ",Manacher(flag));
        }
        return 0;
    }
  • 相关阅读:
    zz java java.nio.ByteBuffer flip
    看到的应用mina做的一个实例
    命令行工具SVN
    ByteBuffer 理解
    Linux命令行下常用svn命令
    三元操作符对null 的处理
    获取最后一个字符串
    C#分割字符串
    学习Silverlight 书籍
    oralce 进行多表同步
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514263.html
Copyright © 2020-2023  润新知