Cod sursa(job #945832)

Utilizator Ionut228Ionut Calofir Ionut228 Data 2 mai 2013 23:08:15
Problema Ordine Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>

using namespace std;

ifstream fin("ordine.in");
ofstream fout("ordine.out");

char s;
int v[27];
int a[1000002][2], j;

int main()
{
    while (fin.get(s))
        if (s >= 'a' && s <= 'z')
            ++v[s - 'a' + 1];

    bool ok = true;
    j = 0;
    for (int i = 1; i <= 26; ++i)
    {
        int ii;
        for (ii = i + 1; ii <= 26; ++ii)
            if (v[ii] != 0)
                break;
        if (ii == 27)
            ok = false;

        if (ok == false)
        {
            int jj;
            if (a[j][0] != i)
            {
                a[++j][0] = i;
                --v[i];
            }
            jj = j;
            while (v[i] != 0)
            {
                while (a[jj][0] == i || a[jj - 1][0] == i)
                    --jj;
                a[jj][1] = i;
                --v[i];
            }
            break;
        }
        else
        {
            while (v[i] != 0 && v[ii] != 0)
            {
                if (a[j][0] != i)
                {
                    if (i < ii)
                    {
                        a[++j][0] = i;
                        a[++j][0] = ii;
                    }
                    else
                    {
                        a[++j][0] = ii;
                        a[++j][0] = i;
                    }
                    --v[i];
                    --v[ii];
                }
                else
                {
                    a[++j][0] = ii;
                    a[++j][0] = i;
                    --v[i];
                    --v[ii];
                }
            }
            if (v[i] == 0)
                i = ii - 1;
            else
                --i;
        }
    }

    for (int i = 1; i <= j; ++i)
    {
        if (a[i][1] != 0)
            fout << char(a[i][1] + 'a' - 1);
        fout << char(a[i][0] + 'a' - 1);
    }

    fin.close();
    fout.close();
}