Cod sursa(job #197417)

Utilizator sigridMaria Stanciu sigrid Data 4 iulie 2008 00:22:12
Problema Ordine Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream.h>
#include<string.h>
#define dim 1000001


ifstream f("ordine.in");
ofstream g("ordine.out");


char s[dim];
int v[30],n,nn,st[dim];


int main()
{
int i,l,j,sf,ok,cul;

f.get(s,dim,'\n');
f.close();

n=strlen(s);
nn=n;
cul=0;
for(i=0;i<n;i++)
  {if(!v[s[i]-'a'+1]) cul++;
   v[s[i]-'a'+1]++;
  }

sf=0;
while(n)
{
for(j=1;j<=30;j++)
 if(v[j])

   {
    if(st[sf]!=j)
       {
	sf++;
	st[sf]=j;
	v[j]--;
	if(!v[j]) cul--;
	n--;
	break;
       }
     else if(cul==1)
      {ok=0;
       for(i=sf;i>1;i--)
	if( (st[i]!=j)&&(st[i-1]!=j) )
	  {
	   sf++;

	   for(l=sf;l>i;l--)
	    st[l]=st[l-1];

	   st[i]=j;
	   v[j]--;
	   ok=1;
	   n--;
	   break;
	  }
       if(ok) break;
      }
   }

}


for(i=1;i<=nn;i++)
 g<<(char)(st[i]+'a'-1);

g<<'\n';



return 0;
}
/*void solutie()
{
int i;

for(i=1;i<=n;i++)
 g<<(char)(st[i]+'a'-1);

g<<'\n';
g.close();
}



int ok(int k)
{
if(st[k]==st[k-1]) return 0;

return 1;

}


int back(int k)
{
int i;

if(k==n+1) {solutie(); return 0;}
 else

   {for(i=1;i<=30;i++)

     if(v[i])
      {
       st[k]=i;

       if(ok(k)) {
		  v[i]--;
		  back(k+1);
		  v[i]++;
		 }
      }
   }

return 0;
} */