#include <string>
#include <iostream>
void callback( std::string const& text )
{
std::cout << text << "\n";
}
bool next_permuation( std::string& test_case,
std::string const& alphabet )
{
for( std::size_t i = 0; i < test_case.length(); ++i )
{
if( test_case[i] == alphabet.back() )
{
if( i == test_case.length() -1 )
{
// letztes Zeichen läuft über -> Ende
return false;
}
// Zeichen an aktueller Stelle ersetzen und Schleifendurchlauf fortsetzen
test_case[i] = alphabet.front();
}
else
{
auto pos = alphabet.find( test_case[i] );
if( pos == std::string::npos )
{
// Zeichen nicht im Alphabet? -> Ende
return false;
}
// kein Überlauf, Zeichen ersetzen
test_case[i] = alphabet[pos +1];
return true;
}
}
return false;
}
int main()
{
std::string const alphabet = "ABC";
std::size_t max_length = 3;
for( std::size_t i = 1; i <= max_length; ++i )
{
std::string testcase( i, alphabet.front() );
do
{
callback( testcase );
}
while( next_permuation( testcase, alphabet ) );
}
int z = 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBjYWxsYmFjayggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKQp7CglzdGQ6OmNvdXQgPDwgdGV4dCA8PCAiXG4iOwp9Cgpib29sIG5leHRfcGVybXVhdGlvbiggc3RkOjpzdHJpbmcmIHRlc3RfY2FzZSwKCQkJCQkgIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbHBoYWJldCApCnsKCWZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2UubGVuZ3RoKCk7ICsraSApCgl7CgkJaWYoIHRlc3RfY2FzZVtpXSA9PSBhbHBoYWJldC5iYWNrKCkgKQoJCXsKCQkJaWYoIGkgPT0gdGVzdF9jYXNlLmxlbmd0aCgpIC0xICkKCQkJewoJCQkJLy8gbGV0enRlcyBaZWljaGVuIGzDpHVmdCDDvGJlciAtPiBFbmRlCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJLy8gWmVpY2hlbiBhbiBha3R1ZWxsZXIgU3RlbGxlIGVyc2V0emVuIHVuZCBTY2hsZWlmZW5kdXJjaGxhdWYgZm9ydHNldHplbgoJCQl0ZXN0X2Nhc2VbaV0gPSBhbHBoYWJldC5mcm9udCgpOwoJCX0KCQllbHNlCgkJewoJCQlhdXRvIHBvcyA9IGFscGhhYmV0LmZpbmQoIHRlc3RfY2FzZVtpXSApOwoJCQlpZiggcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zICkKCQkJewoJCQkJLy8gWmVpY2hlbiBuaWNodCBpbSBBbHBoYWJldD8gLT4gRW5kZQoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIGtlaW4gw5xiZXJsYXVmLCBaZWljaGVuIGVyc2V0emVuCgkJCXRlc3RfY2FzZVtpXSA9IGFscGhhYmV0W3BvcyArMV07CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCXJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKQp7CglzdGQ6OnN0cmluZyBjb25zdCBhbHBoYWJldCA9ICJBQkMiOwoJc3RkOjpzaXplX3QgbWF4X2xlbmd0aCA9IDM7CgoJZm9yKCBzdGQ6OnNpemVfdCBpID0gMTsgaSA8PSBtYXhfbGVuZ3RoOyArK2kgKQoJewoJCXN0ZDo6c3RyaW5nIHRlc3RjYXNlKCBpLCBhbHBoYWJldC5mcm9udCgpICk7CgkJZG8KCQl7CgkJCWNhbGxiYWNrKCB0ZXN0Y2FzZSApOwoJCX0KCQl3aGlsZSggbmV4dF9wZXJtdWF0aW9uKCB0ZXN0Y2FzZSwgYWxwaGFiZXQgKSApOwoJfQoJaW50IHogPSAwOwp9Cg==