Cod sursa(job #1332826)

Utilizator matei_cChristescu Matei matei_c Data 2 februarie 2015 14:47:26
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
using namespace std ;

#define maxalfa 30
#define maxn 1000005

int v[maxalfa], N ;

char sol[maxn] ;

int act = 1, cine ;

int maxx, cinemaxx ;

int main()
{
	std::ios_base::sync_with_stdio(false) ;

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

    char ch ;

    cin >> ch ;

    while( !cin.eof() )
    {
        if( 'a' <= ch && ch <= 'z' )
            ++v[ch - 'a'], ++N ;

        cin >> ch ;
    }

    for(int i = 0; i < maxalfa; ++i)
    {
        if( v[i] > maxx )
        {
            maxx = v[i] ;
            cinemaxx = i ;
        }
    }

    while( act <= N )
    {
        cine = 0 ;

        if( v[cine] == 0 )
            while( v[cine] == 0 )
                ++cine ;

        if( maxx == ( N - act + 1 ) / 2 + 1 )
        {
            sol[act] = 'a' + cinemaxx ;
            --v[cinemaxx] ;
            ++act ;

            if( cine == cinemaxx )
            {
                ++cine ;

                if( v[cine] == 0 )
                    while( v[cine] == 0 )
                        ++cine ;
            }

            sol[act] = 'a' + cine ;
            --v[cine] ;

            ++act ;
        }
        else
        {
            if( cine == sol[act - 1] - 'a' )
            {
                ++cine ;

                if( v[cine] == 0 )
                    while( v[cine] == 0 )
                        ++cine ;
            }

            sol[act] = 'a' + cine ;
            --v[cine] ;
            ++act ;
        }

        maxx = 0 ;
        for(int i = 0; i < maxalfa; ++i)
        {
            if( v[i] > maxx )
            {
                maxx = v[i] ;
                cinemaxx = i ;
            }
        }
    }

    for(int i = 1; i <= N+1; ++i)
        cout << sol[i] ;

	return 0 ;
}