// Jarod42
#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>
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, typename F>
void PowerSet( const std:: vector < T> & v, F f)
{
std:: vector < bool > bitset( v.size ( ) ) ;
do {
f( v, bitset) ;
} while ( increase( bitset) ) ;
}
template < typename T, typename F>
void AllArrangements( const std:: vector < T> & v, F f)
{
PowerSet( v, [ f] ( const std:: vector < T> & v, const std:: vector < bool > & bitset) {
std:: vector < T> toPermute;
for ( std:: size_t i = 0 ; i ! = v.size ( ) ; ++ i) {
if ( bitset[ i] ) {
toPermute.push_back ( v[ i] ) ;
}
}
do {
f( toPermute) ;
} while ( std:: next_permutation ( toPermute.begin ( ) , toPermute.end ( ) ) ) ;
} ) ;
}
int main( )
{
std:: vector < char > vc{ 'A' , 'B' , 'C' , 'D' } ;
std:: sort ( vc.begin ( ) , vc.end ( ) ) ;
std:: cout << "\n ------All Arrangements-------------\n " ;
AllArrangements( vc,
[ ] ( const auto & v) {
for ( const auto & e : v) {
std:: cout << e << " " ; }
std:: cout << std:: endl ;
} ) ;
}
Ly8gSmFyb2Q0MgoKI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8dmVjdG9yPgoKYm9vbCBpbmNyZWFzZShzdGQ6OnZlY3Rvcjxib29sPiYgYnMpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gYnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBic1tpXSA9ICFic1tpXTsKICAgICAgICBpZiAoYnNbaV0gPT0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7IC8vIG92ZXJmbG93Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgp2b2lkIFBvd2VyU2V0KGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBGIGYpCnsKICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJpdHNldCh2LnNpemUoKSk7CgogICAgZG8gewogICAgCWYodiwgYml0c2V0KTsKICAgIH0gd2hpbGUgKGluY3JlYXNlKGJpdHNldCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4Kdm9pZCBBbGxBcnJhbmdlbWVudHMoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIEYgZikKewoJUG93ZXJTZXQodiwgW2ZdKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgYml0c2V0KXsKCQlzdGQ6OnZlY3RvcjxUPiB0b1Blcm11dGU7CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSB2LnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgIGlmIChiaXRzZXRbaV0pIHsKICAgICAgICAgICAgICAgIHRvUGVybXV0ZS5wdXNoX2JhY2sodltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZG8gewoJCQlmKHRvUGVybXV0ZSk7CiAgICAgICAgfSB3aGlsZSAoc3RkOjpuZXh0X3Blcm11dGF0aW9uKHRvUGVybXV0ZS5iZWdpbigpLCB0b1Blcm11dGUuZW5kKCkpKTsKCX0pOwp9CgoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxjaGFyPiB2Y3sgJ0EnLCAnQicsICdDJywgJ0QnIH07CglzdGQ6OnNvcnQodmMuYmVnaW4oKSwgdmMuZW5kKCkpOwogICAgc3RkOjpjb3V0IDw8ICJcbi0tLS0tLUFsbCBBcnJhbmdlbWVudHMtLS0tLS0tLS0tLS0tXG4iOwogICAgQWxsQXJyYW5nZW1lbnRzKHZjLAogICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIHYpewogICAgICAgICAgICAgICAgICAgIAlmb3IgKGNvbnN0IGF1dG8mIGUgOiB2KSB7CiAgICAgICAgICAgICAgICAgICAgCQlzdGQ6OmNvdXQgPDwgZSA8PCAiICI7IH0KICAgICAgICAgICAgICAgICAgICAJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgICAgICB9KTsKfQo=