Cod sursa(job #1204610)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 3 iulie 2014 14:26:05
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <cstring>
#define Nmax 1000005

using namespace std;

char a[Nmax];
int nr[100],aint[1000];

inline void Update(int nod, int st, int dr, int poz, int val)
{
    if(st==dr)
    {
        if(val)
            aint[nod]=st;
        else
            aint[nod]=-1;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        Update(2*nod,st,mij,poz,val);
    else
        Update(2*nod+1,mij+1,dr,poz,val);
    if(aint[2*nod]!=-1)
        aint[nod]=aint[2*nod];
    else
        aint[nod]=aint[2*nod+1];
}

int main()
{

    int N,poz,i,poz1;
    char c;
    freopen ("ordine.in","r",stdin);
    freopen ("ordine.out","w",stdout);
    scanf("%s", (a+1));
    N=strlen(a+1);
    for(i=1;i<=N;++i)
        ++nr[a[i]-'a'];
    for(c='a';c<='z';++c)
        if(nr[c-'a'])
            Update(1,0,25,c-'a',1);
    for(poz=-1,i=1;i<=N;++i)
    {
        printf("%c %d\n", aint[1]+'a',poz);
        poz1=aint[1];
        --nr[poz1];
        if(poz!=-1 && nr[poz])
            Update(1,0,25,poz,1);
        Update(1,0,25,poz1,0);
        poz=poz1;
    }
    printf("\n");
    return 0;
}