Cod sursa(job #1510261)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 24 octombrie 2015 19:16:37
Problema Elimin 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <cstdio>
#define MAXN 2001
int v[MAXN],scm[MAXN],lung[MAXN],next[MAXN],poz[MAXN],vf[10],cifmax[MAXN+1],poz1[MAXN+1],v1[MAXN];
int main(){
    FILE*fi,*fout;
    int i,con,flag,j,n,max,con1,aux,x;
    char a;
    fi=fopen("elimin2.in" ,"r");
    fout=fopen("elimin2.out" ,"w");
    a=fgetc(fi);
    n=0;
    while(a>='0'&&a<='9'){
        v[n++]=a-'0';
        a=fgetc(fi);
    }
    con=0;
    for(i=0; i<n-1; i++){
        j=n-1;
        con1=0;
        flag=1;
        while(flag&&j>i&&con1<=vf[v[i]]){
            if(v[i]==v[j])
                con1++;
            if(con1==vf[v[i]]+1){
                scm[con]=j;
                poz[con++]=i;
                flag=0;
                vf[v[i]]++;
            }
            j--;
        }
    }
    if(con>0){
        max=1;
        for(i=con-1; i>=0; i--){
            lung[i]=1;
            for(j=i+1; j<con; j++)
                if(scm[i]>scm[j]&&lung[i]<lung[j]+1){
                    lung[i]=lung[j]+1;
                    next[i]=j;
                }
            if(lung[i]>max)
                max=lung[i];
            if(v[scm[i]]>cifmax[lung[i]]){
                cifmax[lung[i]]=v[scm[i]];
                poz1[lung[i]]=i;
            }
           // printf("%d %d %d %d\n" ,poz[i],scm[i],lung[i],v[scm[i]]);
        }
        i=max;
        while(cifmax[max]==0)
            max--;
        con=0;
        x=poz1[max];
        while(con<max){
            fprintf(fout,"%d" ,v[scm[x]]);
            v1[con++]=v[scm[x]];
            aux=x;
            x=next[x];
        }
        max=0;
        for(i=poz[aux]+1; i<scm[aux]; i++)
            if(max<v[i])
                max=v[i];
        if(poz[aux]+1<scm[aux])
            fprintf(fout,"%d" ,max);
        for(i=con-1; i>=0; i--)
            fprintf(fout,"%d" ,v1[i]);
    }
    else{
        max=0;
        for(i=0;i<n;i++)
            if(v[i]>max)
              max=v[i];
        fprintf(fout,"%d" ,max);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}