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

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

题意:给以一个序列,然后让你求一个最长回文序列的长度,这个序列的从左到最中间那个数是不降的,从中间那里向右边的话是不增的。

题解:用Manacher搞定,直接套模板还不行,还要做一些判断。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define  M 800050
 6 using namespace std;
 7 int  str1[M],str[M*2];
 8 int rad[M];
 9 void Manacher(int *rad, int  *str,int n){
10   int i,mx=0,id;
11   for(int i=1;i<n;i++){//下标从1开始
12     if(mx>i){
13      rad[i]=min(rad[2*id-i],mx-i);
14     }
15     else rad[i]=1;
16     while(str[i+rad[i]]==str[i-rad[i]]){
17         if(str[i+rad[i]]!=40){
18             if(str[i+rad[i]]<=str[i+rad[i]-2])
19                  rad[i]++;
20             else
21                 break;
22         }
23         else
24             rad[i]++;
25     }
26         if(rad[i]+i>mx){
27             mx=rad[i]+i;
28             id=i;
29         }
30   }
31 }
32 int main(){
33    int ans,cas;
34    scanf("%d",&cas);
35    while(cas--){
36        int nn;
37       scanf("%d",&nn);
38    for(int i=0;i<nn;i++)
39       scanf("%d",&str1[i]);
40      memset(str,0,sizeof(str));
41      int n=nn*2+2;
42      str[0]=40;
43      memset(rad,0,sizeof(rad));
44      for(int i=0;i<=nn;i++){
45          str[2*i+1]=40;
46         str[2*i+2]=str1[i];
47      }
48      Manacher(rad,str,n);
49          ans=1;
50     for(int i=0;i<n;i++)
51         ans=max(ans,rad[i]);
52         printf("%d\n",ans-1);
53    }
54   return 0;
55 }

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

时间: 2024-10-13 00:00:32

吉哥系列故事——完美队形II的相关文章

HDU 4513 吉哥系列故事——完美队形II(Manacher)

Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意: 3.从左到中间那

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

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1075    Accepted Submission(s): 388 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让

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

吉哥系列故事――完美队形II hdu-4513 Description 吉哥又想出了一个新的完美队形游戏!  假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的:  2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中

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

题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形II 题意 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] - h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,

吉哥系列故事——完美队形II(hdu4513+Manacher)

吉哥系列故事--完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1491    Accepted Submission(s): 555 Problem Description 吉哥又想出了一个新的完美队形游戏. 如果有n个人按顺序站在他的面前,他们的身高各自是h[1], h[2] ... h[n].吉哥希望从中挑出一些人,

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

吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个

hdu 4513 吉哥系列故事——完美队形II (manachar算法)

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,

hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1012    Accepted Submission(s): 358 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让

HDU 4513 吉哥系列故事——完美队形II manacher求最长回文

题目来源:吉哥系列故事--完美队形II 题意:中文 思路:在manacher算法向两边扩展的时候加判断 保证非严格递减就行了 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100110; int a[maxn<<1]; int b[maxn<<1]; int dp[maxn<<1]; int