Cod sursa(job #2487078)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 3 noiembrie 2019 21:28:09
Problema Ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <cstdio>

using namespace std;

string s;
int f[26];

int calc_max()
{
    int ans = 0;
    for (int i = 1; i < 26; i++)
    {
        if (f[i] > f[ans])
        {
            ans = i;
        }
    }
    return ans;
}

int calc_max2(int mx1)
{
    int ans = 25 - mx1;
    for (int i = 0; i < 26; i++)
    {
        if (i != mx1 && f[i] > f[ans])
        {
            ans = i;
        }
    }
    return ans;
}

bool ok(int len, int c, int mx1, int mx2)
{
    f[c]--;
    int mx;
    if (f[mx1] > f[mx2])
    {
        mx = mx1;
    }
    else
    {
        mx = mx2;
    }

    bool ok;

    if (len % 2 == 0)
    {
        ok = (f[mx] <= len / 2);
    }
    else
    {
        if (mx == c)
        {
            ok = (f[mx] <= len / 2);
        }
        else
        {
            ok = (f[mx] <= len / 2 + 1);
        }
    }

    f[c]++;
    return ok;
}

int main()
{
    freopen ("ordine.in", "r", stdin);
    freopen ("ordine.out", "w", stdout);

    cin >> s;
    for (auto &x : s)
    {
        f[x - 'a']++;
    }

    int n = (int) s.size(), last = -1;

    for (int i = 1; i <= n; i++)
    {
        int mx1 = calc_max(), mx2 = calc_max2(mx1);
        for (int c = 0; c < 26; c++)
        {
            if (c != last && f[c] && ok(n - i, c, mx1, mx2))
            {
                f[c]--;
                cout << (char) (c + 'a');
                last = c;
                break;
            }
        }
    }


    return 0;
}