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


    题目链接: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
    ", ans);
        }
    return 0;
    }
    View Code
  • 相关阅读:
    第十一章关联容器
    第十章泛型算法
    第九章
    第八章
    阅读记录
    java.lang.Class阅读笔记
    java.time包阅读笔记
    CLion运行多个main函数
    c++中lower_bound和upper_bound中的comp参数
    如何写dfs
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4851507.html
Copyright © 2020-2023  润新知