#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include <vector>
#include <sstream>
#include <string>
#include <functional>
#include <queue>
#include <deque>
#include <stack>
#include <limits>
#include <unordered_map>
#include <unordered_set>
#include <math.h>
#include <fstream>
#include <iterator>
#include <random>
#include <chrono>
 
 
#define forr(i,start,count) for (int i = (start); i < (start)+(count); ++i)
#define set_map_includes(set, elt) (set.find((elt)) != set.end())
#define readint(i) int i; cin >> i
#define readll(i) ll i; cin >> i
#define readdouble(i) double i; cin >> i
#define readstring(s) string s; cin >> s

typedef long long ll;
 
using namespace std;

int editDistDP(string str1, string str2, int m, int n) 
{ 
    // Create a table to store results of subproblems 
    int dp[m + 1][n + 1]; 
  
    // Fill d[][] in bottom up manner 
    for (int i = 0; i <= m; i++) { 
        for (int j = 0; j <= n; j++) { 
            // If first string is empty, only option is to 
            // insert all characters of second string 
            if (i == 0) 
                dp[i][j] = j; // Min. operations = j 
  
            // If second string is empty, only option is to 
            // remove all characters of second string 
            else if (j == 0) 
                dp[i][j] = i; // Min. operations = i 
  
            // If last characters are same, ignore last char 
            // and recur for remaining string 
            else if (str1[i - 1] == str2[j - 1]) 
                dp[i][j] = dp[i - 1][j - 1]; 
  
            // If the last character is different, consider all 
            // possibilities and find the minimum 
            else
                dp[i][j] = 1 + min({dp[i][j - 1], // Insert 
                                   dp[i - 1][j], // Remove 
                                   dp[i - 1][j - 1]}); // Replace 
        } 
    } 
  
    return dp[m][n]; 
} 

int total_count = 0;
string passw = "dWPBls9a7ay9QTKoONR3AGQ9nvfSCn7n0qzgFHT3aw0vQ9m0ItmOwAKEMHoaHBLJsQYiBTmhFBW6pd8aqqDHPjuRXBzGMkwr8Q4nplUAyV9JDz3GPrbWXR6ReAEl6b";
vector<char> alphabet;
vector<int> count_char;
int L;

string merge(string s1, string s2) {
    if ((s1.size()==0) || (s2.size()==0)) {
        return s1+s2;
    }
            int i_insert = 0;
            string ins_ = s2;
            string answer = s1;
            while (ins_.size()>0) {
                string ask_s = answer.substr(0,i_insert);
                ask_s = ask_s + ins_[0];
                ask_s = ask_s + answer.substr(i_insert);
                cout << "? " << ask_s << endl;
                total_count++;
                readint(aa);
//                int aa = editDistDP(ask_s, passw, ask_s.size(), passw.size());
                if (aa == L-ask_s.size()) {
                    answer = ask_s; ins_ = ins_.substr(1);
                }
                i_insert++;
            }
            return answer;
}

string merge_between(int beg, int end) {
    if (end-beg==0) {  return ""; }
    if (end-beg==1) {
        return string(count_char[beg], alphabet[beg]);
    }
    return merge(merge_between(beg, (beg+end)/2), merge_between((beg+end)/2, end));
}

int main()   {
    cout.precision(17);
    ll modd = 1000 * 1000 * 1000 + 7;
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    uniform_int_distribution<int> rand_gen(0, modd);   // rand_gen(rng) gets the rand no
    ll infinit = 10000000000000000;
 
//    readint(test_cases);
    int test_cases = 1;
    forr(t, 1, test_cases) {
        for (char c = '0'; c <= '9'; ++c) {  alphabet.push_back(c);  }
        for (char c = 'a'; c <= 'z'; ++c) {  alphabet.push_back(c);  }
        for (char c = 'A'; c <= 'Z'; ++c) {  alphabet.push_back(c);  }

        L = 0;
        for (char c : alphabet) {
          cout << "? " << string(128, c) << endl;
          readint(aa); 
//          int aa = editDistDP(string(128, c), passw, 128, passw.size());
          L += 128-aa;
          count_char.push_back(128-aa);
        }

        total_count = 0;

        string aa = merge_between(0, alphabet.size());
        cout << "! " << aa << endl;

        cout << total_count << endl;

    }
    return 0;
}

Measured memory_bytes: 3808