Problem: [MisoilePunch♪ - 彩](https://www.youtube.com/watch?v=5VleIdkEeak)

This is an interactive problem!

On a normal day at the hidden office in A.R.C. Markland-N, Rin received an artifact, given to her by the exploration captain Sagar.

After much analysis, she now realizes that this artifact contains data about a strange flower, which has existed way before the New Age. However, the information about its chemical structure has been encrypted heavily.

The chemical structure of this flower can be represented as a string p. From the unencrypted papers included, Rin already knows the length n of that string, and she can also conclude that the string contains at most three distinct letters: "C" (as in Carbon), "H" (as in Hydrogen), and "O" (as in Oxygen).

At each moment, Rin can input a string s of an arbitrary length into the artifact's terminal, and it will return every starting position of s as a substring of p.

However, the artifact has limited energy and cannot be recharged in any way, since the technology is way too ancient and is incompatible with any current A.R.C.'s devices. To be specific:

  * The artifact only contains 7/5 units of energy. 
  * For each time Rin inputs a string s of length t, the artifact consumes (1)/(t^2) units of energy. 
  * If the amount of energy reaches below zero, the task will be considered failed immediately, as the artifact will go black forever. 



Since the artifact is so precious yet fragile, Rin is very nervous to attempt to crack the final data. Can you give her a helping hand?

Interaction

The interaction starts with a single integer t (1 ≤ t ≤ 500), the number of test cases. The interaction for each testcase is described below:

First, read an integer n (4 ≤ n ≤ 50), the length of the string p.

Then you can make queries of type "? s" (1 ≤ |s| ≤ n) to find the occurrences of s as a substring of p.

After the query, you need to read its result as a series of integers in a line:

  * The first integer k denotes the number of occurrences of s as a substring of p (-1 ≤ k ≤ n). If k = -1, it means you have exceeded the energy limit or printed an invalid query, and you need to terminate immediately, to guarantee a "Wrong answer" verdict, otherwise you might get an arbitrary verdict because your solution will continue to read from a closed stream.
  * The following k integers a_1, a_2, …, a_k (1 ≤ a_1 < a_2 < … < a_k ≤ n) denote the starting positions of the substrings that match the string s.



When you find out the string p, print "! p" to finish a test case. This query doesn't consume any energy. The interactor will return an integer 1 or 0. If the interactor returns 1, you can proceed to the next test case, or terminate the program if it was the last testcase.

If the interactor returns 0, it means that your guess is incorrect, and you should to terminate to guarantee a "Wrong answer" verdict.

Note that in every test case the string p is fixed beforehand and will not change during the queries, i.e. the interactor is not adaptive.

After printing any query do not forget to print end of line and flush the output. Otherwise, you might get Idleness limit exceeded. To do this, use:

  * fflush(stdout) or cout.flush() in C++;
  * System.out.flush() in Java;
  * flush(output) in Pascal;
  * stdout.flush() in Python;
  * see the documentation for other languages.



Hacks

For hack, use the following format. Note that you can only hack with one test case:

The first line should contain a single integer t (t = 1).

The second line should contain an integer n (4 ≤ n ≤ 50) — the string's size.

The third line should contain a string of size n, consisting of characters "C", "H" and "O" only. This is the string contestants will have to find out.

Examples

Input


1
4

2 1 2

1 2

0

1

Output




? C

? CH

? CCHO

! CCHH



Input


2
5

0

2 2 3

1
8

1 5

1 5

1 3

2 1 2

1

Output




? O

? HHH

! CHHHH


? COO

? COOH

? HCCOO

? HH

! HHHCCOOH

Note

Note that the example interaction contains extra empty lines so that it's easier to read. The real interaction doesn't contain any empty lines and you shouldn't print any extra empty lines as well.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int mxs = 2005;
char r[3] = {'C', 'H', 'O'};
int nm[55];
int n;
long long ask(vector<int> g) {
  cout << "? ";
  for (int i = 0; i < g.size(); i++) cout << r[g[i]];
  cout << endl;
  fflush(stdout);
  int k;
  cin >> k;
  if (k == -1) exit(0);
  long long res = 0;
  for (int j = 0; j < k; j++) {
    int s;
    cin >> s;
    res += (1ll << (s - 1));
    for (int l = 0; l < g.size(); l++) nm[s + l] = g[l];
  }
  return res;
}
void otp() {
  int res;
  cout << "! ";
  for (int j = 1; j <= n; j++) cout << r[nm[j]];
  cout << endl;
  fflush(stdout);
  cin >> res;
}
int gt(vector<int> x, vector<int> y) {
  int ans = 0;
  for (int i = 0; i < x.size() - y.size() + 1; i++) {
    bool fl = 1;
    for (int j = 0; j < y.size(); j++)
      if (y[j] != x[i + j]) fl = 0;
    if (fl) ans += (1 << i);
  }
  return ans;
}
vector<vector<int>> qs[5];
namespace corner {
using namespace std;
struct way {
  string w;
  vector<vector<string>> sep;
  double e;
  vector<int> mask;
  bool operator<(const way &r) const { return e < r.e; }
};
vector<string> a4, a;
map<vector<string>, pair<double, way>> dp;
const double cost[] = {0, 1.0, 0.25, 1.0 / 9, 1.0 / 16};
int check(string v, string u) {
  int n = u.length(), m = v.length(), opt = 0;
  for (int i = 0; i <= n - m; ++i) {
    int cur = 1;
    for (int j = 0; j < m; ++j)
      if (u[i + j] != v[j]) cur = 0;
    if (cur) opt |= 1 << i;
  }
  return opt;
}
bool search(vector<string> x, double p) {
  if (p < 0) return false;
  if (x.size() == 1) return true;
  if (!dp.count(x)) dp[x].first = 2333;
  if (dp[x].first <= p) return true;
  auto &res = dp[x];
  vector<way> ways;
  for (auto y : a) {
    way k;
    k.w = y;
    map<int, vector<string>> res;
    for (auto z : x) {
      res[check(y, z)].push_back(z);
    }
    int siz = 0;
    for (auto g : res) {
      k.sep.push_back(g.second);
      k.mask.push_back(g.first);
      siz = max(siz, (int)g.second.size());
    }
    double r = (x.size() - siz) * 1.0 / x.size();
    if (r == 0) continue;
    k.e = cost[y.length()] / r;
    ways.push_back(k);
  }
  sort(ways.begin(), ways.end());
  for (auto it : ways) {
    double ep = p - cost[it.w.size()];
    bool no = false;
    for (auto u : it.sep) {
      if (!search(u, ep)) {
        no = true;
        break;
      }
    }
    if (!no) {
      pair<double, way> act = make_pair(0, it);
      for (auto u : it.sep)
        act.first = max(act.first, dp[u].first + cost[it.w.size()]);
      res = min(res, act);
      if (res.first <= p) return true;
    }
  }
  return false;
}
void init() {
  for (char c1 = 'a'; c1 <= 'c'; ++c1) {
    string s = "";
    s += c1;
    a.push_back(s);
    for (char c2 = 'a'; c2 <= 'c'; ++c2) {
      string s = "";
      s += c1;
      s += c2;
      a.push_back(s);
      for (char c3 = 'a'; c3 <= 'c'; ++c3) {
        string s = "";
        s += c1;
        s += c2;
        s += c3;
        a.push_back(s);
        for (char c4 = 'a'; c4 <= 'c'; ++c4) {
          string s = "";
          s += c1;
          s += c2;
          s += c3;
          s += c4;
          a.push_back(s), a4.push_back(s);
        }
      }
    }
  }
}
}  // namespace corner
void work(vector<vector<int>> s, double cur) {
  if (s.size() == 1) {
    for (int j = 1; j <= 4; j++) nm[j] = s[0][j - 1];
    otp();
    return;
  }
  vector<string> t;
  for (int i = 0; i < s.size(); i++) {
    string g = "";
    for (int j = 0; j < 4; j++) g += 'a' + s[i][j];
    t.push_back(g);
  }
  corner::search(t, cur);
  string w = corner::dp[t].second.w;
  vector<int> u(w.length());
  for (int j = 0; j < u.size(); j++)
    if (w[j] == 'a')
      u[j] = 0;
    else if (w[j] == 'b')
      u[j] = 1;
    else
      u[j] = 2;
  int res = ask(u);
  cur -= 1.0 / u.size() / u.size();
  vector<vector<int>> fn;
  for (int j = 0; j < s.size(); j++)
    if (gt(s[j], u) != res)
      continue;
    else
      fn.push_back(s[j]);
  work(fn, cur);
}
int main() {
  corner::init();
  int t;
  cin >> t;
  for (int i = 0; i < 3; i++) {
    vector<int> r(1);
    r[0] = i;
    qs[1].push_back(r);
    for (int j = 0; j < 3; j++) {
      vector<int> u(2);
      u[0] = i, u[1] = j;
      qs[2].push_back(u);
      for (int k = 0; k < 3; k++) {
        vector<int> g(3);
        g[0] = i, g[1] = j, g[2] = k;
        qs[3].push_back(g);
        for (int l = 0; l < 3; l++) {
          vector<int> e(4);
          e[0] = i, e[1] = j, e[2] = k, e[3] = l;
          qs[4].push_back(e);
        }
      }
    }
  }
  for (int i = 0; i < t; i++) {
    cin >> n;
    vector<int> r(2);
    memset(nm, -1, sizeof(nm));
    if (n == 4) {
      vector<vector<int>> q = qs[4];
      work(q, 1.4);
    } else {
      r[0] = 0, r[1] = 0, ask(r);
      r[0] = 1, r[1] = 1, ask(r);
      r[0] = r[1] = 2, ask(r);
      r[0] = 0, r[1] = 2, ask(r);
      r[0] = 1, r[1] = 2, ask(r);
      for (int j = n; j >= 3; j--)
        if (nm[j - 1] == -1 && nm[j] <= 1 && nm[j] != -1) nm[j - 1] = 1 - nm[j];
      r.clear();
      bool fl = 0;
      for (int j = 2; j <= n; j++) {
        if (nm[j] != -1)
          r.push_back(nm[j]);
        else {
          fl = 1;
          r.push_back(j & 1);
        }
      }
      if (fl) ask(r);
      for (int j = 2; j <= n; j++)
        if (nm[j] == -1) nm[j] = 1 - (j & 1);
      if (nm[1] == -1) {
        nm[1] = 2;
        r.clear();
        for (int i = 1; i <= n; i++) r.push_back(nm[i]);
        nm[1] = -1;
        ask(r);
        if (nm[1] == -1) nm[1] = 1 - nm[2];
      }
      otp();
    }
  }
  return 0;
}