#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int sz;
int cur;
int n;
string alpha;
int len;
string now;
string res[ 10100 ] ;
void doit( int dep, int st) {
int i;
if ( sz >= 10010 ) {
return ;
}
if ( dep== len) {
res[ sz++ ] = now;
return ;
}
for ( i= ( st) ; i< ( n) ; i++ ) {
now[ dep] = alpha[ i] ;
doit( dep+ 1 , i+ 1 ) ;
}
}
class CombinationIterator{
public :
CombinationIterator( string characters, int combinationLength) {
int i;
sz = cur = 0 ;
alpha = characters;
len = combinationLength;
n = alpha.size ( ) ;
now = "" ;
for ( i= ( 0 ) ; i< ( len) ; i++ ) {
now + = 'a' ;
}
doit( 0 , 0 ) ;
}
string next( ) {
return res[ cur++ ] ;
}
bool hasNext( ) {
return cur < sz;
}
}
;
// cLay varsion 20191214-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int sz, cur, n;
// string alpha; int len;
// string now;
// string res[10100];
//
// void doit(int dep, int st){
// if(sz >= 10010) return;
// if(dep==len) res[sz++] = now, return;
// rep(i,st,n){
// now[dep] = alpha[i];
// doit(dep+1, i+1);
// }
// }
//
// class CombinationIterator {
// public:
// CombinationIterator(string characters, int combinationLength) {
// sz = cur = 0;
// alpha = characters;
// len = combinationLength;
// n = alpha.size();
// now = "";
// rep(i,len) now += 'a';
// doit(0, 0);
// }
// string next() {
// return res[cur++];
// }
// bool hasNext() {
// return cur < sz;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KaW50IHN6OwppbnQgY3VyOwppbnQgbjsKc3RyaW5nIGFscGhhOwppbnQgbGVuOwpzdHJpbmcgbm93OwpzdHJpbmcgcmVzWzEwMTAwXTsKdm9pZCBkb2l0KGludCBkZXAsIGludCBzdCl7CiAgaW50IGk7CiAgaWYoc3ogPj0gMTAwMTApewogICAgcmV0dXJuOwogIH0KICBpZihkZXA9PWxlbil7CiAgICByZXNbc3orK10gPSBub3c7CiAgICByZXR1cm47CiAgfQogIGZvcihpPShzdCk7aTwobik7aSsrKXsKICAgIG5vd1tkZXBdID0gYWxwaGFbaV07CiAgICBkb2l0KGRlcCsxLCBpKzEpOwogIH0KfQpjbGFzcyBDb21iaW5hdGlvbkl0ZXJhdG9yewogIHB1YmxpYzoKICBDb21iaW5hdGlvbkl0ZXJhdG9yKHN0cmluZyBjaGFyYWN0ZXJzLCBpbnQgY29tYmluYXRpb25MZW5ndGgpewogICAgaW50IGk7CiAgICBzeiA9IGN1ciA9IDA7CiAgICBhbHBoYSA9IGNoYXJhY3RlcnM7CiAgICBsZW4gPSBjb21iaW5hdGlvbkxlbmd0aDsKICAgIG4gPSBhbHBoYS5zaXplKCk7CiAgICBub3cgPSAiIjsKICAgIGZvcihpPSgwKTtpPChsZW4pO2krKyl7CiAgICAgIG5vdyArPSAnYSc7CiAgICB9CiAgICBkb2l0KDAsIDApOwogIH0KICBzdHJpbmcgbmV4dCgpewogICAgcmV0dXJuIHJlc1tjdXIrK107CiAgfQogIGJvb2wgaGFzTmV4dCgpewogICAgcmV0dXJuIGN1ciA8IHN6OwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MTIxNC0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGludCBzeiwgY3VyLCBuOwovLyBzdHJpbmcgYWxwaGE7IGludCBsZW47Ci8vIHN0cmluZyBub3c7Ci8vIHN0cmluZyByZXNbMTAxMDBdOwovLyAKLy8gdm9pZCBkb2l0KGludCBkZXAsIGludCBzdCl7Ci8vICAgaWYoc3ogPj0gMTAwMTApIHJldHVybjsKLy8gICBpZihkZXA9PWxlbikgcmVzW3N6KytdID0gbm93LCByZXR1cm47Ci8vICAgcmVwKGksc3Qsbil7Ci8vICAgICBub3dbZGVwXSA9IGFscGhhW2ldOwovLyAgICAgZG9pdChkZXArMSwgaSsxKTsKLy8gICB9Ci8vIH0KLy8gCi8vIGNsYXNzIENvbWJpbmF0aW9uSXRlcmF0b3IgewovLyBwdWJsaWM6Ci8vICAgQ29tYmluYXRpb25JdGVyYXRvcihzdHJpbmcgY2hhcmFjdGVycywgaW50IGNvbWJpbmF0aW9uTGVuZ3RoKSB7Ci8vICAgICBzeiA9IGN1ciA9IDA7Ci8vICAgICBhbHBoYSA9IGNoYXJhY3RlcnM7Ci8vICAgICBsZW4gPSBjb21iaW5hdGlvbkxlbmd0aDsKLy8gICAgIG4gPSBhbHBoYS5zaXplKCk7Ci8vICAgICBub3cgPSAiIjsKLy8gICAgIHJlcChpLGxlbikgbm93ICs9ICdhJzsKLy8gICAgIGRvaXQoMCwgMCk7Ci8vICAgfQovLyAgIHN0cmluZyBuZXh0KCkgewovLyAgICAgcmV0dXJuIHJlc1tjdXIrK107Ci8vICAgfQovLyAgIGJvb2wgaGFzTmV4dCgpIHsKLy8gICAgIHJldHVybiBjdXIgPCBzejsKLy8gICB9Ci8vIH07Cg==