#include <algorithm>
#include <iostream>
#include <vector>
template < typename T>
bool increase( const std:: vector < T> & v, std:: vector < std:: size_t > & its)
{
for ( std:: size_t i = 0 , size = its.size ( ) ; i ! = size; ++ i) {
const std:: size_t index = size - 1 - i;
++ its[ index] ;
if ( its[ index] == v.size ( ) ) {
its[ index] = 0 ;
} else {
return true ;
}
}
return false ;
}
template < typename T>
void do_job( const std:: vector < T> & v, std:: vector < std:: size_t > & its)
{
// Print example.
for ( std:: size_t i = 0 , size = v.size ( ) ; i ! = size; ++ i) {
std:: cout << v[ its[ i] ] << " " ;
}
std:: cout << std:: endl ;
}
template < std:: size_t N>
void test( )
{
std:: vector < char > v( N) ;
std:: iota ( v.begin ( ) , v.end ( ) , 'a' ) ;
std:: vector < std:: size_t > its( N, 0 ) ;
do {
do_job( v, its) ;
} while ( increase( v, its) ) ;
}
int main( )
{
test< 3 > ( ) ;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpib29sIGluY3JlYXNlKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0cykKewogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMCwgc2l6ZSA9IGl0cy5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgaW5kZXggPSBzaXplIC0gMSAtIGk7CiAgICAgICAgKytpdHNbaW5kZXhdOwogICAgICAgIGlmIChpdHNbaW5kZXhdID09IHYuc2l6ZSgpKSB7CiAgICAgICAgICAgIGl0c1tpbmRleF0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZG9fam9iKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0cykKewogICAgLy8gUHJpbnQgZXhhbXBsZS4KICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDAsIHNpemUgPSB2LnNpemUoKTsgaSAhPSBzaXplOyArK2kpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgdltpdHNbaV1dIDw8ICIgIjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgp2b2lkIHRlc3QoKQp7CiAgICBzdGQ6OnZlY3RvcjxjaGFyPiB2KE4pOwogICAgc3RkOjppb3RhKHYuYmVnaW4oKSwgdi5lbmQoKSwgJ2EnKTsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpdHMoTiwgMCk7CgogICAgZG8gewogICAgICAgIGRvX2pvYih2LCBpdHMpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXRzKSk7Cgp9CgoKaW50IG1haW4oKQp7CiAgICB0ZXN0PDM+KCk7Cn0K