#include <iostream>
#include <climits>
#include <cmath>
#include <vector>
#include <map>
#include <set>
 
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;

#define _L 128
#define _Q 850

#define MOD 1000000007LL
/*
struct pstr {
  string str;
  bool operator<(const pstr &s) const {
    return str.size() > s.str.size();
  }
};*/
struct custom_compare final
{
    bool operator() (const std::string& left, const std::string& right) const
    {
      size_t llen=left.size();
      size_t rlen=right.size();
      if (llen < rlen) {
        return true;
      } else if (llen == rlen) {
        return left < right;
      } else {
        return false;
      }
      return false;
    }
};

set<string, custom_compare> pn;
vector<pair<int, int>>px;
//vector<set<int>> p_cand;
//map<int, set<int>> c_cand;
map<int, int> cn;
map<string, int> rdist;
int len;

char ps[_L+1];
//const char *pc="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string pc;
char *cor;

void print_cand();
void make_str(int);
int ask(string);
int ldist(string, string);
int qcnt;

//int main(int argc, char *argv[])
int main()
{
  int i,j;
  int ed;
  string bstr, cstr;
//  pstr p;
/*
  if (argc > 1) {
    cor = argv[1];
  } else {
    cor = NULL;
  }*/

  len=0;

  pc = "";
  for (i=0; i<26; i++) pc += 'a'+i;
  for (i=0; i<26; i++) pc += 'A'+i;
  for (i=0; i<10; i++) pc += '0'+i;

  qcnt=0;
  //各文字の使用数を確認
  ps[_L] = '\0';
  for (i=0; i<62; i++) {
    for (j=0; j<_L; j++) {
      ps[j] = pc[i];
    }
    ed = ask(string(128, pc[i]));
    if (ed < _L) {
      pn.insert(string(_L - ed, pc[i]));
      cn.emplace(i, _L - ed);
      len += _L - ed;
    }
    if (len >= _L) break;
  }
//printf("pn.size() = %lu\n", pn.size()); fflush(stdout);
//for (auto it=pn.begin(); it!=pn.end(); it++) {printf("%s:%lu ", it->c_str(), it->size());fflush(stdout);} printf("\n");

  while (pn.size() >= 2) {
//for (auto it=pn.begin(); it!=pn.end(); it++) {printf("%s:%lu ", it->c_str(), it->size());fflush(stdout);} printf("\n");
    auto it = pn.begin();
    string X = *it;
    it = pn.erase(it);
    string Y = *it;
    pn.erase(it);
    string XY;
    while (!X.empty() and !Y.empty()) {
      string S = XY + Y[0] + X;
      ed = ask(S);
      if (ed + (int)S.size() == len) {
        XY += Y[0];
        Y.erase(Y.begin());
      } else {
        XY += X[0];
        X.erase(X.begin());
      }
    }
    XY += X; XY += Y;
    pn.insert(XY);
  }
  cout << "! " << *pn.begin() << endl;

  return 0;
}

int ask(string ps) {
  int ed;

  if (cor) {
//printf("ldist(\n \"%s\",\n \"%s\") = %d\n", ps.c_str(), cor, ldist(ps, string(cor))); fflush(stdout);
    return ldist(ps, string(cor));
  }

  qcnt++;
  printf("? %s\n", ps.c_str()); fflush(stdout);
  cin >> ed;
  return ed;
}

int ldist(string s1, string s2) {
  size_t j, k;
  size_t m;
  size_t len1 = s1.size();
  size_t len2 = s2.size();
  vector<vector<size_t>> d(len1+1, vector<size_t>(len2+1));
  for (j=0; j<=len1; j++) d[j][0] = j;
  for (k=0; k<=len2; k++) d[0][k] = k;

  for (j=1; j<=len1; j++) {
    for (k=1; k<=len2; k++) {
      m = min(d[j-1][k]+1, d[j][k-1]+1);
      d[j][k] = min(m, d[j-1][k-1]+((s1[j-1] == s2[k-1])?0:1));
    }
  }
  return d[len1][len2];
}

/*
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  */

Measured memory_bytes: 3792