Cod sursa(job #3123517)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 24 aprilie 2023 11:52:41
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda teme_upb Marime 3.4 kb
#include <iostream>

using namespace std;

const int maxLen = 100005;
int n, k, test, minst[maxLen], maxdr[maxLen];
string str;

void solve_basic();
void solve2();
void solve3();

void solve()
{
    test++;
    cout << "Case #" << test << ": ";
    cin >> k >> str;
    n = str.size();
    if(k > 3)
        solve_basic();
    if(k == 3)
        solve3();
    if(k == 2)
        solve2();
    cout << '\n';
}

void solve3()
{
    /// NIMIC
}

void solve2()
{
    int litera = str[0] - 'A' + 1;
    bool onlyOneLetter = 1;
    minst[0] = str[0] - 'A' + 1;
    for(int i = 1; i < n; i++)
    {
        minst[i] = min(minst[i - 1], str[i] - 'A' + 1);
        if(str[i] - 'A' + 1 != litera)
            onlyOneLetter = 0;
    }
    if(onlyOneLetter)
    {
        cout << "POSSIBLE\n";
        for(int i = 0; i < n - 1; i++)
            cout << str[i];
        cout << ' ' << str[n - 1];
        return;
    }
    for(int i = n - 1; i >= 0; i--)
        maxdr[i] = max(maxdr[i + 1], str[i] - 'A' + 1);
    int poz = -1;
    for(int i = 1; i < n; i++)
    {
        if(minst[i - 1] >= maxdr[i])
        {
            cout << "POSSIBLE\n";
            for(int j = 0; j < i; j++)
                cout << str[j];
            cout << ' ';
            for(int j = i; j < n; j++)
                cout << str[j];
            return;
        }
    }
}

void solve_basic()
{
    int poz;
    bool sorted = 1;
    for(int i = 1; i < n; i++)
    {
        if(str[i] < str[i - 1])
        {
            sorted = 0;
            poz = i;
        }
    }
    if(!sorted)
    {
        cout << "POSSIBLE\n";
        k -= 4;
        for(int i = 0; i < poz - 1; i++)
        {
            cout << str[i];
            if(k && i != poz - 2)
            {
                cout << ' ';
                k--;
            }
        }
        cout << ' ';
        cout << str[poz - 1] << ' ';
        cout << str[poz] << ' ';
        for(int i = poz + 1; i < n; i++)
        {
            cout << str[i];
            if(k)
            {
                cout << ' ';
                k--;
            }
        }
    }
    else
    {
        if(k == n)
        {
            cout << "IMPOSSIBLE\n";
            return;
        }

        int frecv = 1, poz = -1;
        for(int i = 1; i < n; i++)
        {
            if(str[i] == str[i - 1])
                frecv++;
            else
                frecv = 1;
            if(frecv >= 3)
                poz = i;
        }
        if(poz == -1)
        {
            cout << "IMPOSSIBLE\n";
            return;
        }
        cout << "POSSIBLE\n";
        k -= 4;
        for(int i = 0; i < poz - 2; i++)
        {
            cout << str[i];
            if(k && i != poz - 3)
            {
                cout << ' ';
                k--;
            }
        }
        cout << ' ';
        cout << str[poz - 2] << str[poz - 1] << ' ';
        cout << str[poz] << ' ';
        for(int i = poz + 1; i < n; i++)
        {
            cout << str[i];
            if(k)
            {
                cout << ' ';
                k--;
            }
        }
    }
}

int main()
{
    #ifdef LOCAL
        freopen("test.in", "r", stdin);
        freopen("test.out", "w", stdout);
    #endif // LOCAL
    int nr_teste;
    cin >> nr_teste;
    while(nr_teste--)
        solve();
    return 0;
}