#include <algorithm>
#include <iterator>
template<class data_iter>
bool next_combination(data_iter data_begin, data_iter data_end, typename std::iterator_traits<data_iter>::value_type alph_begin, typename std::iterator_traits<data_iter>::value_type alph_end)
{
if (data_begin==data_end) return false;
data_iter data_cur = data_begin;
while (++*data_cur == alph_end) {
*data_cur = alph_begin;
++data_cur;
if (data_cur == data_end)
return false;
}
return true;
}
#include <iostream>
int main()
{
char data[] = {'A', 'A', 'A', '\0'};
do {
std::cout << data << '\n';
} while(next_combination(data+0, data+3, 'A', 'C'));
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKdGVtcGxhdGU8Y2xhc3MgZGF0YV9pdGVyPgpib29sIG5leHRfY29tYmluYXRpb24oZGF0YV9pdGVyIGRhdGFfYmVnaW4sICBkYXRhX2l0ZXIgZGF0YV9lbmQsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGRhdGFfaXRlcj46OnZhbHVlX3R5cGUgYWxwaF9iZWdpbiwgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8ZGF0YV9pdGVyPjo6dmFsdWVfdHlwZSBhbHBoX2VuZCkgCnsKICAgIGlmIChkYXRhX2JlZ2luPT1kYXRhX2VuZCkgcmV0dXJuIGZhbHNlOwogICAgZGF0YV9pdGVyIGRhdGFfY3VyID0gZGF0YV9iZWdpbjsKICAgIHdoaWxlICgrKypkYXRhX2N1ciA9PSBhbHBoX2VuZCkgewogICAgICAgICpkYXRhX2N1ciA9IGFscGhfYmVnaW47CiAgICAgICAgKytkYXRhX2N1cjsKICAgICAgICBpZiAoZGF0YV9jdXIgPT0gZGF0YV9lbmQpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKICAgIGNoYXIgZGF0YVtdID0geydBJywgJ0EnLCAnQScsICdcMCd9OyAgICAKICAgIGRvIHsgICAgICAgIAogICAgICAgIHN0ZDo6Y291dCA8PCBkYXRhIDw8ICdcbic7CiAgICB9IHdoaWxlKG5leHRfY29tYmluYXRpb24oZGF0YSswLCBkYXRhKzMsICdBJywgJ0MnKSk7CiAgICByZXR1cm4gMDsKfQ==