码迷,mamicode.com
首页 > 其他好文 > 详细

吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)

时间:2015-10-01 21:46:13      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513

题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i-p[i]]<=s[i-p[i]+2]就可以了;

用最长回文串算法manacher:套一下模板就可以了;

技术分享
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 2e5+7;

int p[N];
int s[N];
int Manacher(int s[], int n)
{
    int Id=0, mx = 0, ans = 0;
    for(int i=2; i<n; i++)
    {
        if(mx > i)
            p[i] = min(p[Id*2-i], mx-i);
        else
            p[i] = 1;
        while(s[i+p[i]] == s[i-p[i]] && s[i-p[i]]<=s[i-p[i]+2] )///要满足的条件是前面的要小于后面的人所以要这样写;
            p[i]++;
        if(mx < p[i]+i)
        {
            mx = p[i]+i;
            Id = i;
        }
        ans = max(ans, p[i]);
    }
    return ans - 1;
}
int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i=0; i<n; i++)
            scanf("%d", &s[i]);
        for(int i=n; i>=0; i--)
        {
            s[i+i+2] = s[i];
            s[i+i+1] = 0;
        }
        s[0] = 1;
        int ans = Manacher(s, 2*n+2);
        printf("%d\n", ans);
    }
return 0;
}
View Code

 

吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4851507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!