#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef void showproc(const string &result);
typedef showproc *showptr;
void show(const string &result)
{
cout<<result<<endl;
}
string prepare(const vector<int> &idx,const string &alphas)
{
string str(idx.size(),'\0');
for(size_t i=0;i<idx.size();++i) str[i]=alphas[idx[i]];
return str;
}
bool next(vector<int> &idx,size_t maxvalue)
{
for(size_t i=idx.size()-1;i<idx.size();idx[i--]=0) if(++idx[i]<maxvalue) return true;
return false;
}
void permutations(size_t size,const string &alphas,showptr show)
{
vector<int> idx(size,0);
do { show(prepare(idx,alphas)); } while(next(idx,alphas.size()));
}
void permutations(size_t minsize,size_t maxsize,string alphas,showptr show)
{
for(size_t size=minsize;size<=maxsize;++size) permutations(size,alphas,show);
}
int main()
{
permutations(2,4,"ABCD",&show);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiB2b2lkIHNob3dwcm9jKGNvbnN0IHN0cmluZyAmcmVzdWx0KTsKdHlwZWRlZiBzaG93cHJvYyAqc2hvd3B0cjsKCnZvaWQgc2hvdyhjb25zdCBzdHJpbmcgJnJlc3VsdCkKewogICAgY291dDw8cmVzdWx0PDxlbmRsOwp9CgpzdHJpbmcgcHJlcGFyZShjb25zdCB2ZWN0b3I8aW50PiAmaWR4LGNvbnN0IHN0cmluZyAmYWxwaGFzKQp7CiAgICBzdHJpbmcgc3RyKGlkeC5zaXplKCksJ1wwJyk7CiAgICBmb3Ioc2l6ZV90IGk9MDtpPGlkeC5zaXplKCk7KytpKSBzdHJbaV09YWxwaGFzW2lkeFtpXV07CiAgICByZXR1cm4gc3RyOwp9Cgpib29sIG5leHQodmVjdG9yPGludD4gJmlkeCxzaXplX3QgbWF4dmFsdWUpCnsKICAgIGZvcihzaXplX3QgaT1pZHguc2l6ZSgpLTE7aTxpZHguc2l6ZSgpO2lkeFtpLS1dPTApIGlmKCsraWR4W2ldPG1heHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKdm9pZCBwZXJtdXRhdGlvbnMoc2l6ZV90IHNpemUsY29uc3Qgc3RyaW5nICZhbHBoYXMsc2hvd3B0ciBzaG93KQp7CiAgICB2ZWN0b3I8aW50PiBpZHgoc2l6ZSwwKTsKICAgIGRvIHsgc2hvdyhwcmVwYXJlKGlkeCxhbHBoYXMpKTsgfSB3aGlsZShuZXh0KGlkeCxhbHBoYXMuc2l6ZSgpKSk7Cn0KCnZvaWQgcGVybXV0YXRpb25zKHNpemVfdCBtaW5zaXplLHNpemVfdCBtYXhzaXplLHN0cmluZyBhbHBoYXMsc2hvd3B0ciBzaG93KQp7CiAgICBmb3Ioc2l6ZV90IHNpemU9bWluc2l6ZTtzaXplPD1tYXhzaXplOysrc2l6ZSkgcGVybXV0YXRpb25zKHNpemUsYWxwaGFzLHNob3cpOwp9CgppbnQgbWFpbigpCnsKICAgIHBlcm11dGF0aW9ucygyLDQsIkFCQ0QiLCZzaG93KTsgICAgCn0=