// vvvvvvvvvvvv TEMPLATE vvvvvvvvvvvv
#include <bits/stdc++.h>
using namespace std; using ll = long long; using P = pair<ll, ll>;
const ll linf = 1e18; const double eps = 1e-12, pi = acos(-1);
#define FOR(i,a,b) for (ll i=(a),__last_##i=(b);i<__last_##i;i++)
#define RFOR(i,a,b) for (ll i=(b)-1,__last_##i=(a);i>=__last_##i;i--)
#define REP(i,n) FOR(i,0,n)
#define RREP(i,n) RFOR(i,0,n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define each(i,a) for (auto&& i : a)
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define eb emplace_back
#define all(a) begin(a),end(a)
#define chmin(x,v) x = min(x, v)
#define chmax(x,v) x = max(x, v)
#define min(x,y) (x < y ? x : y)
#define max(x,y) (x < y ? y : x)
template<typename Head> void out(Head h) { cout << h << endl; } template<typename Head, typename... Tail>void out(Head h, Tail... t) { cout << h << " "; out(t...); }
template<typename T> istream& operator>>(istream& is, vector<T>& v) { each(x,v) is >> x; return is; }
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) { rep(i,v.size()) { if (i) os << " "; os << v[i]; } return os; }
template<typename T> ostream& operator<<(ostream& os, const vector<string>& v) { rep(i,v.size()) { if (i) os << endl; os << v[i]; } return os; }
template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v) { rep(i,v.size()) { if (i) os << endl; os << v[i]; } return os; }
struct yes_no : std::numpunct<char> { string_type do_truename() const { return "Yes"; } string_type do_falsename() const { return "No"; } };
void solve(); int main() {
  solve();
}
// ^^^^^^^^^^^^ TEMPLATE ^^^^^^^^^^^^

enum Color {
  Red, Blue, Unknown
};

ll query_cnt = 0;

Color query(vector<ll> selected) {
  ++query_cnt;
  assert(query_cnt <= 210);
  each(x, selected) ++x;
  cout << "? " << selected << endl;
  string res; cin >> res;
  assert(res != "-1");
  return res == "Blue" ? Blue : Red;
}

void output(const vector<Color>& ans) {
  string ansstr = "";
  rep(i, ans.size()) {
    if (ans[i] == Red) ansstr += 'R';
    else if (ans[i] == Blue) ansstr += 'B';
    else ansstr += '?';
  }
  cout << "! " << ansstr << endl;
}

void solve() {
  ll n; cin >> n;
  vector<ll> R(n), B(n);
  rep(i, n) R[i] = i, B[i] = n+i;
  if (query(R) == Blue) {
    swap(B, R);
  }
  set<ll> common;
  while (R.size() > 1) {
    assert(B.size() == R.size());
    assert(common.size() + B.size() == n);
    ll cnt = R.size() / 2;
    vector<ll> v(all(common));
    rep(i, cnt) v.pb(R[i]);
    rep(i, cnt, B.size()) v.pb(B[i]);
    if (query(v) == Red) {
      vector<ll> nR, nB;
      rep(i, cnt) {
        nR.pb(R[i]);
        nB.pb(B[i]);
      }
      rep(i, cnt, B.size()) common.insert(B[i]);
      R = nR, B = nB;
    }
    else {
      vector<ll> nR, nB;
      rep(i, cnt, R.size()) {
        nR.pb(R[i]);
        nB.pb(B[i]);
      }
      rep(i, cnt) common.insert(R[i]);
      R = nR, B = nB;
    }
  }
  assert(B.size() == 1);
  assert(R.size() == 1);
  assert(common.size() == n-1);

  vector<Color> ans(2*n, Unknown);
  ans[B[0]] = Blue;
  ans[R[0]] = Red;
  rep(i, 2*n) {
    if (ans[i] == Unknown && common.count(i) == 0) {
      vector<ll> v(all(common));
      v.pb(i);
      if (query(v) == Red) {
        ans[i] = Red;
      }
      else {
        ans[i] = Blue;
      }
    }
  }
  set<ll> ncommon;
  rep(i, 2*n) {
    if (common.count(i) == 0) {
      ncommon.insert(i);
    }
  }
  ncommon.erase(R[0]);
  ncommon.erase(B[0]);
  common = ncommon;
  // output(ans);
  rep(i, 2*n) {
    if (ans[i] == Unknown) {
      assert(common.count(i) == 0);
      vector<ll> v(all(common));
      v.pb(i);
      if (query(v) == Red) {
        ans[i] = Red;
      }
      else {
        ans[i] = Blue;
      }
    }
  }
  rep(i, 2*n) assert(ans[i] != Unknown);

  output(ans);
}


Measured memory_bytes: 724