Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

Noob needs help with his code :) code with details, appreciate any feedback!
Difference between en2 and en3, changed 0 character(s)
https://codeforces.com/contest/1335/problem/E1↵

When I run the test, it keeps going well, and suddenly it fails on test 10 data 596 or something, so I cannot see what test case is causing the problem. Im asking for help after 3+hours of coding ! Id really appreciate any help.↵
Source code below, with detail;↵
------↵


It works on almost all cases, but there seems to be a counterexample that I seem to be missing. Thanks :)↵

~~~~~↵
#include <iostream>↵
#include <vector>↵
 ↵
using namespace std;↵
 ↵
int min_num(int a, int b)↵
{↵
    return a<b ? a : b;↵
}↵
void solve()↵
{↵
    int n;↵
    int a[200002];↵
    vector<int> cnt[202];↵
    int ccnt[200002]={0,};↵
    cin >>n;↵
    int i,j,k;↵
    for(i=1 ; i<=n ; i++)↵
    {↵
        cin >>a[i];↵
        cnt[a[i]].push_back(i); ↵
//this cnt stores the location of each number↵
//ex) 1 1 3 3 2 1 -> cnt[1] = 1, 2, 6  cnt[2] = 5, cnt[3] = 3, 4↵
        ccnt[a[i]]++;↵
    }↵
    int cntmax = 0;↵
    for(i=1 ; i<=200000 ; i++) if(cntmax < ccnt[i]) cntmax = ccnt[i];↵
// this for loop is for a palindrome that uses only 1 kind of number, so the number↵
// with the most count is the longest palindrome↵
// realmax is where the final answer will be stored↵
    int realmax=cntmax;↵
    for(i=1 ; i<=200 ; i++) // middle part of palindrome↵
    {↵
        for(j=1 ; j<=200 ; j++) // left/right part of palindrome↵
// I am searching for the longest palindrome which uses i as the left/right part↵
// and j as the middle part such like i i i j j j j i i i↵
        {↵
            int max = 0;↵
            if(i!=j && cnt[i].size() > 0 && cnt[j].size() > 0)↵
            {↵
                vector<int> b;↵
                int l=0;↵
                ↵
                for(k=0; k<cnt[i].size() ; k++)↵
                {↵
                    while(1)↵
                    {↵
                        if(l==cnt[j].size()) break;↵
                        if(cnt[j][l] < cnt[i][k]) ↵
                        {↵
                            l++;↵
                        }↵
                        else break;↵
                    }↵
                    b.push_back(l);↵
                }↵
//b stores the number of cnt[j] members that is less than each cnt[i] members↵
//if cnt[i] = 1 2 7 8, cnt[j] = 3, 5↵
// b will be 0, 0, 2, 2 (b[i] = count of cnt[j] members that is less than cnt[i][k]↵
        ↵
                for(k=0 ; k<b.size() ; k++)↵
                {↵
                    int sum=0;↵
                    int frontback = min_num(b[k], cnt[j].size()-b[k]);↵
                    sum += frontback * 2;↵
//frontback is the length of the surrounding two pallindromes↵
                    ↵
                    int t;↵
                    int count = 0;↵
 ↵
// now we calculate the length of the middle part of the palindrome↵
// if cnt[j].size &mdash; b[t] is more than the frontback, we can extend the middle part↵
                   ↵
                    for(t=k ; t<b.size() ; t++)↵
                    {↵
                        if(cnt[j].size() - b[t] >= frontback) count++;↵
                        else break;↵
                    }↵
                    sum+=count;↵
                    ↵
                    if(max < sum) max=sum;↵
                    ↵
                }↵
            }↵
            if(realmax < max) realmax = max;↵
        }↵
    }↵
    cout << realmax << "\n"; ↵
    return;↵
}↵
int main(void)↵
{↵
    int n;↵
    cin >> n;↵
    while(n--)↵
    {↵
        solve();↵
    }↵
    ↵
    return 0;↵
}↵
~~~~~

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en3 English Wonsei 2020-06-16 17:17:37 0 (published)
en2 English Wonsei 2020-06-16 17:13:42 3067 (saved to drafts)
en1 English Wonsei 2020-06-16 16:59:06 531 Initial revision (published)