Cod sursa(job #997475)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 14 septembrie 2013 11:34:40
Problema Ordine Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.48 kb
#include<stdio.h>

char q[1000000];
int v[26];
char w[1000000];

int main()
{
    FILE *f, *g;

    int i,s=0,a1,a2,c=0,m,u,alt,flag=0;

    f=fopen("ordine.in","r");
    g=fopen("ordine.out","w");

    fscanf(f,"%s",&q);

    //stabilesc vectorul de frecventa
    i=0;
    while(i<strlen(q))
    {
        v[q[i]-'a']++;
        i++;
    }

    //stabilesc s .

    for(i=0;i<26;i++)
        s+=v[i];

    //stabilesc a1 si a2

    a1=0;
    while(v[a1]==0)
        a1++;
    a2=a1+1;
    while(v[a2]==0)
        a2++;

    while(s>0)
    {
        while(v[a1]!=0 && v[a2]!=0)
        {
            if(a1+'a'>='a' && a1+'a'<='z')
            {
                //fprintf(g,"%c",a1+'a');
                w[c]=a1+'a';
                c++;
            }
            v[a1]--;s--;
            if(v[a1]!=0)
            {
                if(a2+'a'>='a' && a2+'a'<='z')
                {
                    //fprintf(g,"%c",a2+'a');
                    w[c]=a2+'a';
                    c++;
                }
                v[a2]--;s--;
            }

        }
        if(v[a1]==0)
        {
            a1=a2;
            a2=a1+1;
            while(v[a2]==0)
                a2++;
        }
        else
        {
            a2++;
            while(v[a2]==0)
                a2++;

        }
    }
    //printf("c=%d\n",c);

    for(i=1;i<c;i++)
    {
        if(!(w[i-1]!=w[i]))
        {
            //printf("am intrat in if,i=%d\n",i);
            m=i-1;
            //printf("m=%d\n",m);
            alt=w[i-1];
            while(w[m]==w[m+1])
                m--;
            //printf("1)M=%d,w[m-1]=%c,alt=%c\n",m,w[m-1],alt);
            if(alt==w[m-1])
            {
               // printf("fost-am pe aici??\n");
                m-=2;
                flag=0;
                while(flag==0)
                {
                    if(w[m]!=w[m+1] && w[m]!=w[m-1])
                        flag=1;
                    else m--;
                }
            }
            //printf("2)M=%d\n",m);
            //printf("am iesit din while si m=%d\n",m);
            alt=w[i-1];
            for(u=c;u>=m;u--)
                w[u+1]=w[u];
            c++;
            w[m]=alt;
            //printf("w[%d]=%c\n",m,w[m]);
            for(u=w[i-2];u<c;u++)
                w[u]=w[u+1];
            c--;
        }
    }

    for(i=0;i<c;i++)
        fprintf(g,"%c",w[i]);

    fclose(f);
    fclose(g);

    return 0;
}