// 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==