Codeforces 1335E2 - Three Blocks Palindrome (hard version)

题面

题意/解题思路

直接延用 Easy 版本的想法即可

详解见上一篇博客Codeforces 1335E1 - Three Blocks Palindrome (easy version)

完整程序

(93ms/2000ms)

#include<bits/stdc++.h>
using namespace std;
int ar[200050];
vector<int> v[210];

void solve()
{
    int n,ans=0;
    cin>>n;
    for(int i=1;i<=200;i++)
        v[i].clear();
    for(int i=1;i<=n;i++)
    {
        cin>>ar[i];
        v[ar[i]].push_back(i);
    }
    for(int i=1;i<=200;i++)
    {
        int cnt=v[i].size(),cntt;
        ans=max(ans,cnt);

        if(cnt<=1)
            continue;

        cntt=cnt/2;

        int num[210]={0},mx=0;

        for(int j=v[i][cntt-1]+1;j<v[i][cnt-cntt];j++)
            num[ar[j]]++;
        for(int j=1;j<=200;j++)
            if(num[j]>mx)
                mx=num[j];
        ans=max(ans,mx+cntt*2);

        for(int j=cntt-1;j>0;j--)
        {
            for(int k=v[i][j-1]+1;k<v[i][j];k++)
                num[ar[k]]++;
            for(int k=v[i][cnt-j-1]+1;k<v[i][cnt-j];k++)
                num[ar[k]]++;
            for(int k=1;k<=200;k++)
                if(num[k]>mx)
                    mx=num[k];
            ans=max(ans,mx+j*2);
        }
    }
    cout<<ans<<‘\n‘;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;cin>>T;
    for(int t=1;t<=T;t++)
        solve();
    return 0;
}

原文地址:https://www.cnblogs.com/stelayuri/p/12695392.html

时间: 2024-10-09 01:29:24

Codeforces 1335E2 - Three Blocks Palindrome (hard version)的相关文章

Codeforces 1335E1 - Three Blocks Palindrome (easy version)

题面 题意 给定一个长度为 n 的数列 定义要求的回文子数列满足下图条件 其中 x 与 y 可以为 0 即这个回文子数列可以是数字完全相同的一个子数列 也可以是只包含两种数字,且其中一种平均分布在另一种数字的两侧 求出最长的回文子数列长度 解题思路 在输入时往vector里记录下每个数字出现的位置 然后开始枚举位于两侧的数字的种类 i( i = 1 ~ 26 ) 首先考虑这个回文子数列只包含一种数字,刚好根据枚举 直接将答案与枚举的字符数量取大(与枚举到的vector[i].size取大) 然后

Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version) -- manacher

D2. Prefix-Suffix Palindrome (Hard version) 题目链接 manacher做法 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int p[N*2]; string manacher(string ss) { int len = ss.size(); string s; s.resize(len*2+2); for(int i=len;i>=0;i--) {

Codeforces 1326D2 - Prefix-Suffix Palindrome (Hard version)

题目大意 T组数据,每组给定一个字符串 s 求一个最长的字符串 t ,满足: t 是一个回文串 t = a+b ,a是字符串s的前缀,b是字符串s的后缀,'+' 为拼接两字符串,ab可能为空串 数据范围 数据组数不超过 1e5 字符串的总共长度不超过 1e6 解题思路 (标准做法应该是哈希) 因为对于任意的字符串T,设R(T)为T的倒置 则 T+回文串+R(T) 仍然是一个回文串 可以直接双指针在s里找出最长的 T和R(T) while(L<R&&s[L]==s[R]) L++,R-

Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)

Link 题意: \(a\) 是 \(s\) 的前缀,\(b\) 是 \(s\) 的后缀 使 \(a+b\) 是可以找到的最大的回文串 \(a\) 或 \(b\) 可以是空串 思路: 找出最大长度 \(k\) 使 \(s[0,k-1]+s[len(s)-k,len(s)-1]\) 是回文串 再用 Manacher 算法求出 \(s[k,len(s)-k-1]\) 中以 \(s[k]\) 为右端的的最大回文串和以 \(s[len(s)-k-1]\)为左端的最大回文串(计算出 \(len[i]\)

Codeforces Gym 100570 E. Palindrome Query Manacher

E. Palindrome QueryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100570/problem/E Description De Prezer loves palindrome strings. A string s1s2...sn is palindrome if and only if it is equal to its reverse. De Prezer also love

Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力

Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between easy and hard versions is a number of elements in the array. You are given an array \(a\) consisting of \(n\) integers. The value of the \(i\)-th element

Codeforces 838A - Binary Blocks(二维前缀和+容斥)

838A - Binary Blocks 思路:求一下前缀和,然后就能很快算出每一小正方块中1的个数了,0的个数等于k*k减去1的个数,两个的最小值就是要加进答案的值. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),sizeof(a)) const int INF=0x3f3f3f3f; cons

Codeforces 1172C2 Nauuo and Pictures (hard version) dp

Nauuo and Pictures (hard version 首先考虑简单版本的, 一个一个dp求出来, 分成三坨, 一坨当前要求照片, 一坨除了当前的喜欢的照片, 一坨除了当前的讨厌的照片. 单次dp   50 ^ 4 感觉hard的也挺简单的.. 我们先算出最后喜欢的照片的总w, 和讨厌的照片的总w, 然后每个的贡献就是在原先的w中所占的比例. #include<bits/stdc++.h> #define LL long long #define LD long double #de

Codeforces - 1203D2 - Remove the Substring (hard version) - 双指针

https://codeforces.com/contest/1203/problem/D2 上次学了双指针求两个字符串之间的是否t是s的子序列.但其实这个双指针可以求出的是s的前i个位置中匹配t的最长的前缀.反过来求一次可以得到最长的后缀. 然后怎么找要删除的位置呢?暴力n^2肯定可以,然后线性写挂到自闭. 枚举位置[i,j),注意j可以取相等,所以预处理前后缀的时候把n位置的后缀也算好. 去除子串[i,j),那么剩下的就是[0,i-1]和[j,n-1]两个子串,他们匹配的长度加起来超过tl就