#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
void print_combinations_aux( char * s, size_t pos) {
if ( s[ pos] == '\0 ' ) {
print_combinations_aux( s, pos + 1 ) ;
print_combinations_aux( s, pos + 1 ) ;
} else {
print_combinations_aux( s, pos + 1 ) ;
}
}
void print_combinations_inplace( char * s) {
print_combinations_aux( s, 0 ) ;
}
void print_combinations( char const * s) {
print_combinations_inplace( p) ;
}
char * next_combination( char * s) {
// upper -> 0, lower -> 1
char * p;
if ( * s == '\0 ' ) { return NULL; }
for ( p = s; * p; ++ p) {
continue ;
return s;
} else {
}
}
return NULL;
}
void analyze( const char * c, unsigned * bitmask, unsigned * combos, char * togglecase)
{
unsigned bit= 1 ;
int i;
* bitmask = 0 ;
* combos = 1 ;
for ( ; * c; c++, bit<<= 1 )
* combos <<= 1 ;
else
* bitmask |= bit;
for ( i= 0 ; i< 256 ; i++ )
}
void next_bit_combination( char * c, unsigned * pbitmask, unsigned startmask, const char * togglecase) {
unsigned bitmask = * pbitmask;
* pbitmask = bitmask + 1 ;
unsigned diff = ( bitmask ^ * pbitmask) & ~startmask;
* pbitmask = * pbitmask | startmask;
unsigned least_index;
if ( diff == 1 )
c[ 0 ] = togglecase[ ( unsigned char ) c[ 0 ] ] ;
else
do {
least_index = __builtin_ctz( diff) ;
c[ least_index] = togglecase[ ( unsigned char ) c[ least_index] ] ;
} while ( ( diff -= 1u<< least_index) ) ;
}
int main( ) {
clock_t start, end;
//char buf[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZA";
//char buf[] = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !";
// für ideone
char buf[ ] = "A B C" ;
unsigned bitmask, combos, startmask;
char table[ 256 ] ;
analyze( buf, & bitmask, & combos, table) ;
startmask = bitmask;
for ( ; combos--; next_bit_combination( buf, & bitmask, startmask, table) ) {
}
fprintf ( stderr
, "bittig: %lf\n " , ( double ) ( end
- start
) / CLOCKS_PER_SEC
) ;
do {
} while ( next_combination( buf) ) ;
fprintf ( stderr
, "iterativ: %lf\n " , ( double ) ( end
- start
) / CLOCKS_PER_SEC
) ;
print_combinations_inplace( buf) ;
fprintf ( stderr
, "rekursiv: %lf\n " , ( double ) ( end
- start
) / CLOCKS_PER_SEC
) ;
return 0 ;
}
I2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgogCnZvaWQgcHJpbnRfY29tYmluYXRpb25zX2F1eChjaGFyICpzLCBzaXplX3QgcG9zKSB7CiAgaWYoc1twb3NdID09ICdcMCcpIHsKICAgIHB1dHMocyk7CiAgfSBlbHNlIGlmKGlzYWxwaGEoc1twb3NdKSkgewogICAgc1twb3NdID0gdG91cHBlcihzW3Bvc10pOwogICAgcHJpbnRfY29tYmluYXRpb25zX2F1eChzLCBwb3MgKyAxKTsKICAgIHNbcG9zXSA9IHRvbG93ZXIoc1twb3NdKTsKICAgIHByaW50X2NvbWJpbmF0aW9uc19hdXgocywgcG9zICsgMSk7CiAgfSBlbHNlIHsKICAgIHByaW50X2NvbWJpbmF0aW9uc19hdXgocywgcG9zICsgMSk7CiAgfQp9CiAKdm9pZCBwcmludF9jb21iaW5hdGlvbnNfaW5wbGFjZShjaGFyICpzKSB7CiAgcHJpbnRfY29tYmluYXRpb25zX2F1eChzLCAwKTsKfQogCnZvaWQgcHJpbnRfY29tYmluYXRpb25zKGNoYXIgY29uc3QgKnMpIHsKICBjaGFyICpwID0gbWFsbG9jKHN0cmxlbihzKSArIDEpOwogIHN0cmNweShwLCBzKTsKICBwcmludF9jb21iaW5hdGlvbnNfaW5wbGFjZShwKTsKICBmcmVlKHApOwp9CiAKY2hhciAqbmV4dF9jb21iaW5hdGlvbihjaGFyICpzKSB7CiAgLy8gdXBwZXIgLT4gMCwgbG93ZXIgLT4gMQogIGNoYXIgKnA7CiAKICBpZigqcyA9PSAnXDAnKSB7IHJldHVybiBOVUxMOyB9CiAKICBmb3IocCA9IHM7ICpwOyArK3ApIHsKICAgIGlmKCFpc2FscGhhKCpwKSkgewogICAgICBjb250aW51ZTsKICAgIH0gZWxzZSBpZihpc3VwcGVyKCpwKSkgewogICAgICAqcCA9IHRvbG93ZXIoKnApOwogICAgICByZXR1cm4gczsKICAgIH0gZWxzZSB7CiAgICAgICpwID0gdG91cHBlcigqcCk7CiAgICB9CiAgfQogCiAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQgYW5hbHl6ZShjb25zdCBjaGFyICpjLCB1bnNpZ25lZCAqYml0bWFzaywgdW5zaWduZWQgKmNvbWJvcywgY2hhciAqdG9nZ2xlY2FzZSkKewogIHVuc2lnbmVkIGJpdD0xOwogIGludCBpOwoKICAqYml0bWFzayA9IDA7CiAgKmNvbWJvcyA9IDE7CiAgZm9yICg7ICpjOyBjKyssIGJpdDw8PTEpCiAgICBpZiAoaXNhbHBoYSgqYykpCiAgICAgICpjb21ib3MgPDw9IDE7CiAgICBlbHNlCiAgICAgICpiaXRtYXNrIHw9IGJpdDsKCiAgZm9yIChpPTA7IGk8MjU2OyBpKyspCiAgICB0b2dnbGVjYXNlW2ldID0gaXN1cHBlcihpKSA/IHRvbG93ZXIoaSkgOiB0b3VwcGVyKGkpOwp9Cgp2b2lkIG5leHRfYml0X2NvbWJpbmF0aW9uKGNoYXIgKmMsIHVuc2lnbmVkICpwYml0bWFzaywgdW5zaWduZWQgc3RhcnRtYXNrLCBjb25zdCBjaGFyICp0b2dnbGVjYXNlKSB7CiAgdW5zaWduZWQgYml0bWFzayA9ICpwYml0bWFzazsKICAqcGJpdG1hc2sgPSBiaXRtYXNrICsgMTsKICB1bnNpZ25lZCBkaWZmID0gKGJpdG1hc2sgXiAqcGJpdG1hc2spICYgfnN0YXJ0bWFzazsKICAqcGJpdG1hc2sgPSAqcGJpdG1hc2sgfCBzdGFydG1hc2s7CiAgdW5zaWduZWQgbGVhc3RfaW5kZXg7CiAgaWYgKGRpZmYgPT0gMSkKICAgIGNbMF0gPSB0b2dnbGVjYXNlWyh1bnNpZ25lZCBjaGFyKWNbMF1dOwogIGVsc2UKICAgIGRvIHsKICAgICAgbGVhc3RfaW5kZXggPSBfX2J1aWx0aW5fY3R6KGRpZmYpOwogICAgICBjW2xlYXN0X2luZGV4XSA9IHRvZ2dsZWNhc2VbKHVuc2lnbmVkIGNoYXIpY1tsZWFzdF9pbmRleF1dOwogICAgfSB3aGlsZSAoKGRpZmYgLT0gMXU8PGxlYXN0X2luZGV4KSk7Cn0KIAppbnQgbWFpbigpIHsKICAgIAogIGNsb2NrX3Qgc3RhcnQsIGVuZDsKICAvL2NoYXIgYnVmW10gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpBIjsKICAvL2NoYXIgYnVmW10gPSAiQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaICEiOwoKICAvLyBmw7xyIGlkZW9uZQogIGNoYXIgYnVmW10gPSAiQSBCIEMiOwogIAogIHN0YXJ0ID0gY2xvY2soKTsKIAogIHVuc2lnbmVkIGJpdG1hc2ssIGNvbWJvcywgc3RhcnRtYXNrOwogIGNoYXIgdGFibGVbMjU2XTsKICBhbmFseXplKGJ1ZiwgJmJpdG1hc2ssICZjb21ib3MsIHRhYmxlKTsKICBzdGFydG1hc2sgPSBiaXRtYXNrOwogIGZvciAoOyBjb21ib3MtLTsgbmV4dF9iaXRfY29tYmluYXRpb24oYnVmLCAmYml0bWFzaywgc3RhcnRtYXNrLCB0YWJsZSkpIHsKICAgIHB1dHMoYnVmKTsKICB9CiAKICBlbmQgPSBjbG9jaygpOwogCiAgZnByaW50ZihzdGRlcnIsICJiaXR0aWc6ICVsZlxuIiwgKGRvdWJsZSkgKGVuZCAtIHN0YXJ0KSAvIENMT0NLU19QRVJfU0VDKTsKCiAgcHV0cyhidWYpOwogIHB1dHMoYnVmKTsKICBwdXRzKGJ1Zik7CiAgcHV0cyhidWYpOwogCiAgc3RhcnQgPSBjbG9jaygpOwogCiAgZG8gewogICAgcHV0cyhidWYpOwogIH0gd2hpbGUobmV4dF9jb21iaW5hdGlvbihidWYpKTsKIAogIGVuZCA9IGNsb2NrKCk7CiAKICBmcHJpbnRmKHN0ZGVyciwgIml0ZXJhdGl2OiAlbGZcbiIsIChkb3VibGUpIChlbmQgLSBzdGFydCkgLyBDTE9DS1NfUEVSX1NFQyk7CiAKICBzdGFydCA9IGNsb2NrKCk7CiAKICBwcmludF9jb21iaW5hdGlvbnNfaW5wbGFjZShidWYpOwogCiAgZW5kID0gY2xvY2soKTsKIAogIGZwcmludGYoc3RkZXJyLCAicmVrdXJzaXY6ICVsZlxuIiwgKGRvdWJsZSkgKGVuZCAtIHN0YXJ0KSAvIENMT0NLU19QRVJfU0VDKTsKIAogIHJldHVybiAwOwp9Cgo=