Pagini recente » Cod sursa (job #2239962) | Cod sursa (job #287991) | Cod sursa (job #2561622) | Cod sursa (job #2966210) | Cod sursa (job #109575)
Cod sursa(job #109575)
#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 ( ) ;
}