// Jarod42 
 
#include <algorithm> 
#include <cassert> 
#include <iostream> 
#include <iterator> 
#include <vector> 
 
template  < typename  T> 
void  Permutation( std:: vector < T>  v) 
{ 
    std:: sort ( v.begin ( ) , v.end ( ) ) ; 
    do  { 
        std:: copy ( v.begin ( ) , v.end ( ) , std:: ostream_iterator < T> ( std:: cout , " " ) ) ; 
        std:: cout  <<  std:: endl ; 
    }  while  ( std:: next_permutation ( v.begin ( ) , v.end ( ) ) ) ; 
} 
 
template  < typename  T> 
void  Combination( const  std:: vector < T> &  v, std:: size_t  count) 
{ 
    assert ( count <=  v.size ( ) ) ; 
    std:: vector < bool >  bitset( count, 1 ) ; 
    bitset.resize ( v.size ( ) , 0 ) ; 
 
    do  { 
        for  ( std:: size_t  i =  0 ;  i ! =  v.size ( ) ;  ++ i)  { 
            if  ( bitset[ i] )  { 
                std:: cout  <<  v[ i]  <<  " " ; 
            } 
        } 
        std:: cout  <<  std:: endl ; 
    }  while  ( std:: prev_permutation ( bitset.begin ( ) , bitset.end ( ) ) ) ; 
} 
 
bool  increase( std:: vector < bool > &  bs) 
{ 
    for  ( std:: size_t  i =  0 ;  i ! =  bs.size ( ) ;  ++ i)  { 
        bs[ i]  =  ! bs[ i] ; 
        if  ( bs[ i]  ==  true )  { 
            return  true ; 
        } 
    } 
    return  false ;  // overflow 
} 
 
template  < typename  T> 
void  PowerSet( const  std:: vector < T> &  v) 
{ 
    std:: vector < bool >  bitset( v.size ( ) ) ; 
 
    do  { 
        for  ( std:: size_t  i =  0 ;  i ! =  v.size ( ) ;  ++ i)  { 
            if  ( bitset[ i] )  { 
                std:: cout  <<  v[ i]  <<  " " ; 
            } 
        } 
        std:: cout  <<  std:: endl ; 
    }  while  ( increase( bitset) ) ; 
} 
 
int  main( ) 
{ 
    std:: vector < char >  vc{  'A' , 'B' , 'C' , 'D'  } ; 
    std:: vector < char >  path; 
    std:: vector < bool >  visited( 4 , false ) ; 
    std:: cout  <<  "\n ------PERMUTATION----------\n " ; 
    Permutation( vc) ; 
    std:: cout  <<  "\n ------COMBINATION----------\n " ; 
    Combination( vc, 3 ) ; 
    std:: cout  <<  "\n ------POWERSET-------------\n " ; 
    PowerSet( vc) ; 
    return  0 ; 
} 
 
 
				Ly8gSmFyb2Q0MgoKI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgUGVybXV0YXRpb24oc3RkOjp2ZWN0b3I8VD4gdikKewogICAgc3RkOjpzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICBkbyB7CiAgICAgICAgc3RkOjpjb3B5KHYuYmVnaW4oKSwgdi5lbmQoKSwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPFQ+KHN0ZDo6Y291dCwgIiAiKSk7CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbih2LmJlZ2luKCksIHYuZW5kKCkpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgQ29tYmluYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIHN0ZDo6c2l6ZV90IGNvdW50KQp7CiAgICBhc3NlcnQoY291bnQgPD0gdi5zaXplKCkpOwogICAgc3RkOjp2ZWN0b3I8Ym9vbD4gYml0c2V0KGNvdW50LCAxKTsKICAgIGJpdHNldC5yZXNpemUodi5zaXplKCksIDApOwoKICAgIGRvIHsKICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHYuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgaWYgKGJpdHNldFtpXSkgewogICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHZbaV0gPDwgIiAiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9IHdoaWxlIChzdGQ6OnByZXZfcGVybXV0YXRpb24oYml0c2V0LmJlZ2luKCksIGJpdHNldC5lbmQoKSkpOwp9Cgpib29sIGluY3JlYXNlKHN0ZDo6dmVjdG9yPGJvb2w+JiBicykKewogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBicy5zaXplKCk7ICsraSkgewogICAgICAgIGJzW2ldID0gIWJzW2ldOwogICAgICAgIGlmIChic1tpXSA9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsgLy8gb3ZlcmZsb3cKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgUG93ZXJTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYpCnsKICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJpdHNldCh2LnNpemUoKSk7CgogICAgZG8gewogICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gdi5zaXplKCk7ICsraSkgewogICAgICAgICAgICBpZiAoYml0c2V0W2ldKSB7CiAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgdltpXSA8PCAiICI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0gd2hpbGUgKGluY3JlYXNlKGJpdHNldCkpOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHZjeyAnQScsICdCJywgJ0MnLCAnRCcgfTsKICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHBhdGg7CiAgICBzdGQ6OnZlY3Rvcjxib29sPiB2aXNpdGVkKDQsIGZhbHNlKTsKICAgIHN0ZDo6Y291dCA8PCAiXG4tLS0tLS1QRVJNVVRBVElPTi0tLS0tLS0tLS1cbiI7CiAgICBQZXJtdXRhdGlvbih2Yyk7CiAgICBzdGQ6OmNvdXQgPDwgIlxuLS0tLS0tQ09NQklOQVRJT04tLS0tLS0tLS0tXG4iOwogICAgQ29tYmluYXRpb24odmMsIDMpOwogICAgc3RkOjpjb3V0IDw8ICJcbi0tLS0tLVBPV0VSU0VULS0tLS0tLS0tLS0tLVxuIjsKICAgIFBvd2VyU2V0KHZjKTsKICAgIHJldHVybiAwOwp9Cg==