Cod sursa(job #109575)

Utilizator alutzuAlexandru Stoica alutzu Data 25 noiembrie 2007 11:57:43
Problema Ordine Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 1.55 kb
#include<stdio.h>
#include<string.h>
#define NMAX 1000000

int k , n , f [ 30 ] ;
char st [ NMAX ] ,  x [ NMAX ] ;

void init ( )
   { st [ k ] = 'a' - 1 ; }

int succesor ( )
    {

       if ( st [ k ] < maxl && ( k <= n ) )
	 { st [ k ] ++ ; return 1 ; }

       return 0;

    }

int nr ( char c )
   {

      long i , ch = 0 ;
      for ( i = 0 ; i <= k ; i ++ )
	if ( st [ i ] == c ) ch ++ ;

      return ch ;

   }

int valid ( )
     {

	if ( strchr ( x , st [ k ] ) )
	   if ( nr ( st [ k ] ) <= f [ st [ k ] - 'a' ] )
	   return ( st [ k ] != st [ k - 1 ] ) ;

	return  0;

     }

void tipar ( )
      {

	 puts ( st ) ;

      }

int solutie ( )
   {
      return ( ( k + 1 ) == n ) ;
   }

void backt ( )
       {

	  k = 0 ; init ( ) ;
	  int es , ev ;

	  while ( k > -1 )
	     {

		 do
		    {

		       es = succesor ( ) ;
		       if ( es )
			 ev = valid ( ) ;

		    }  while ( es && ! ev ) ;

		 if ( es )
		    {
		       if ( solutie ( ) )
			    {
			      tipar ( ) ;
			      k = -1;
			    }

		       else
			  { k ++ ; init ( ) ; }

		    }

		 else
		    k -- ;
	     }


       }

int main ( )
      {

	 freopen ( "backt.in" , "r" , stdin ) ;
	 freopen ( "backt.out" , "w" , stdout ) ;


	 gets ( x ) ;

	 //facem frecventza

	 n = strlen ( x ) ;
	 long i ;

	 char maxl = '\'' ;

	 for ( i = 0 ; i < n ; i ++ )
	    {
	       f [ x [ i ] - 'a' ] ++ ;
	       if ( x [ i ] > maxl )
		  maxl = x [ i ] ;

	    }


	 backt ( ) ;



      }