// #include<bits/stdc++.h>
// using namespace std;
// int query(string q);
// int n, s;
// namespace sub12{
// string solve(){
// string ans = "";
// for(int i = 0, bef = 0; i < n; i++){
// for(int j = 0; j <= i; j++){
// for(int k = 0; k < s; k++){
// string candidate = "";
// for(int t = 0; t < j; t++){
// candidate += ans[t];
// }
// candidate += char('a' + k);
// for(int t = j; t < i; t++){
// candidate += ans[t];
// }
// if(query(candidate) > bef){
// bef++;
// ans = candidate;
// j = i;
// break;
// }
// }
// }
// }
// return ans;
// }
// }
// namespace sub34{
// string solve(){
// vector<int>cnt(s), ord(s);
// for(int i = 0; i + 1 < s; i++){
// cnt[ord[i] = i] = query(string(n, 'a' + i));
// }
// cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
// sort(ord.begin(), ord.end(), [&] (int i, int j){
// return cnt[i] < cnt[j];
// });
// string ans = "";
// for(int& c : ord){
// vector<int>f(ans.size(), 0);
// for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
// f[p] = cnt[c];
// for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
// string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
// if(query(temp) != ++exp){
// f[p] = k - 1;
// break;
// }
// }
// cnt[c] -= f[p];
// }
// string nans = "";
// for(int p = 0; p < ans.size(); nans += ans[p++]){
// nans += string(f[p], 'a' + c);
// }
// swap(ans, nans);
// ans += string(cnt[c], 'a' + c);
// }
// return ans;
// }
// }
// namespace sub5{
// vector<int>cnt, ord;
// string small_solve(vector<int>ord){
// string ans = "";
// for(int& c : ord){
// vector<int>f(ans.size(), 0);
// for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
// f[p] = cnt[c];
// for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
// string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
// if(query(temp) != ++exp){
// f[p] = k - 1;
// break;
// }
// }
// cnt[c] -= f[p];
// }
// string nans = "";
// for(int p = 0; p < ans.size(); nans += ans[p++]){
// nans += string(f[p], 'a' + c);
// }
// swap(ans, nans);
// ans += string(cnt[c], 'a' + c);
// }
// return ans;
// }
// string solve(){
// cnt.resize(s);
// ord.resize(s);
// for(int i = 0; i + 1 < s; i++){
// cnt[ord[i] = i] = query(string(n, 'a' + i));
// }
// cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
// sort(ord.begin(), ord.end(), [&] (int i, int j){
// return cnt[i] < cnt[j];
// });
// vector<int>part;
// for(int i = 0; i < s; i += 2){
// part.push_back(ord[i]);
// }
// string ans = small_solve(part);
// part.clear();
// for(int i = 1; i < s; i += 2){
// part.push_back(ord[i]);
// }
// string other = small_solve(part);
// int i = 0;
// for(int p = 0; p < ans.size(); p++){
// for(; i < other.size(); i++, p++){
// string next_ans = ans.substr(0, p) + other[i] + ans.substr(p, int(ans.size()) - p);
// if(query(next_ans) != next_ans.size()){
// break;
// }
// swap(ans, next_ans);
// }
// }
// while(i < other.size()){
// ans += other[i++];
// }
// return ans;
// }
// }
// string guess(int _n, int _s){
// if((n = _n) <= (s = _s) || (n <= 100 && s <= 4)){
// return sub12::solve();
// }
// if(n <= 3500){
// return sub34::solve();
// }
// return sub5::solve();
// }
#include <bits/stdc++.h>
using namespace std;
int f[26];
int query(string s);
string guess(int n,int c)
{
for (char a='a';a<'a'+c;a++)
f[a-'a']=query(string(n,a));
string ans="";
for (char a='a';a<'a'+c;a++)
{
int p=ans.size();
string tmp=ans;
for (int i=0;i<f[a-'a'];i++)
{
while (p>=31 && query(ans.substr(0,p-31)+string(i+1,a))<=p-31+i)
p-=32;
int st=max(p-31,0),en=p;
while (st!=en)
{
int mid=(st+en+1)/2;
if (query(ans.substr(0,mid)+string(i+1,a))>mid+i)
st=mid;
else
en=mid-1;
}
tmp.insert(tmp.begin()+st,a);
p=st;
}
ans=tmp;
}
return ans;
}