// #include "pch.h"
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <climits>
#include <string>
#include <cmath>
#include <bitset>
#include <complex>
#include <functional>
#include <ctime>
#include <cassert>
#include <fstream>
#include<unordered_map>
#include <stack>
#include <random>

typedef long long ll;
typedef std::pair<int, int> Pii;
typedef std::pair<long long, long long> Pll;
typedef std::pair<double, double> Pdd;

#define rip(i, n, s) for (int i = (s);i < (int)( n ); i++)
#define all(a) a.begin(), a.end()
#define MM << " " <<

template<typename T>
using MaxHeap = std::priority_queue<T>;
template<typename T>
using MinHeap = std::priority_queue<T, std::vector<T>, std::greater<T>>;

template<typename T>
inline bool chmax(T &a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}
template<typename T>
inline bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<typename T>
void vdeb(std::vector<T> &da) {
    for (int i = 0;i < da.size();i++) {
        if (i == da.size() - 1) std::cout << da[i];
        else std::cout << da[i] << ' ';
    }
    std::cout << std::endl;
}
template<typename T>
void vdeb(std::vector<std::vector<T>> &da) {
    for (int i = 0;i < da.size();i++) {
        std::cout << i << ' ';
        vdeb(da[i]);
    }
    std::cout << std::endl;
}

int distance(const std::string &s, const std::string &t) {
    int n = s.size(), m = t.size();
    std::vector<std::vector<int>> dp(n+1, std::vector<int>(m+1, n+m));
    dp[0][0] = 0;
    for(int i = 0; i<n+1;++i) {
        for(int j = 0; j < m+1; ++j) {
            if(i > 0) chmin(dp[i][j], dp[i-1][j] + 1);
            if(j > 0) chmin(dp[i][j], dp[i][j-1] + 1);
            if(i > 0 && j > 0) chmin(dp[i][j], dp[i-1][j-1] + ((s[i-1] == t[j-1])?0:1));
        }
    }
    return dp[n][m];
}

using namespace std;

const string BB = "0123456789acbdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

const string CHE = "9aasAAaA0aarroaurboar02848q4bq947q4";

int output(string x) {
    cout << "?" MM x << endl;
    int ret; cin >> ret;
    return ret;
    /*int ret = distance(CHE, x);
    printf("%d\n", ret);
    return ret;*/
}

string insert(string &s, char c, int x, bool query = false) {
    string ret = "";
    rip(i,x,0) ret += s[i];
    ret += c;
    if(query) {
        rip(i,s.size(), x) ret += s[i]; 
    }
    else {
        rip(i,s.size(), x) if(s[i] == c) ret += c;
    }
    return ret;
}

string nibutan(string ans, char c, int si) {
    int ok = 0, ng = ans.size() + 1;
    while(ng-ok > 1) {
        int now = (ng + ok)/2;
        string ret = insert(ans, c, now);
        int k = ret.size();
        int res = output(ret);
        if(si - res == k) ok = now;
        else ng = now;
    }
    return insert(ans, c, ok, true);
}

int main() {
    int da[62];
    rip(i,62,0) {
        string x = "";
        rip(j,128,0) x += BB[i];
        da[i] = 128-output(x);
    }
    int si = 0;
    rip(i,62,0) si += da[i];
    string ans = "";
    rip(i,62,0) {
        rip(j, da[i], 0) {
            ans = nibutan(ans, BB[i], si);
            // cout << "@" MM ans << endl;
        }
    }
    cout << "!" MM ans << endl;
}

Measured memory_bytes: 3756