Cod sursa(job #110026)

Utilizator dominoMircea Pasoi domino Data 25 noiembrie 2007 16:16:09
Problema Ordine Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 1000005
#define FIN "ordine.in"
#define FOUT "ordine.out"

int N, cnt[26];
char S[MAX_N];

int main(void)
{
    int i, n, pos, num, prev;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    fgets(S, sizeof(S), stdin);
    N = strlen(S);
    if (S[N-1] == '\n') --N;

    for (i = 0; i < N; ++i)
        ++cnt[S[i]-'a'];
    for (prev = -1, n = N; n; --n)
    {
        for (i = 0; i < 26; ++i)
            if (cnt[i] && i != prev) break;
        if (i == 26) break;
        --cnt[prev = i];
    }
    pos = prev;
    memset(cnt, 0, sizeof(cnt));
    for (i = 0; i < N; ++i)
        ++cnt[S[i]-'a'];
    num = cnt[pos];
    for (prev = -1; N; --N)
    {
        for (i = 0; i < 26; ++i)
            if (cnt[i] && i != prev) break;
        if (((num && pos < i) || (N == 2*num-1)) && pos != prev)
            i = pos, --num;
        printf("%c", i+'a');
        --cnt[prev = i];
    }
    printf("\n");

    return 0;
}