#include <algorithm>
#include <array>
#include <assert.h>
#include <chrono>
#include <bitset>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <random>
#include <queue>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef vector<ld> vld;
typedef vector<vector<int>> vvi;
typedef vector<ll> vl;
typedef vector<vector<ll>> vvl;
typedef vector<vector<ld>> vvld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector<pll> vpll;

#ifdef OLBOEB
mt19937 rnd(228 + 1488 + 238 + 24111997 % 322);
#else
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif

void print_time() {
#ifdef OLBOEB
    cout.flush();
    cerr << "\ntime: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
}

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define sz(x) ((ll)(x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

template <typename T>
void update_max(T& x, T y) { x = max(x, y); }
template <typename T>
void update_min(T& x, T y) { x = min(x, y); }

template<class T1, class T2>
ostream& operator<< (ostream &out, pair<T1, T2> pair) { return out << "(" << pair.first << ", " << pair.second << ")";}
template<class T> ostream& operator<<(ostream& out, vector<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class T> ostream& operator<<(ostream& out, set<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class L, class R> ostream& operator<<(ostream& out, map<L, R> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }


ll ask(vl p) {
    cout << "?";
    for (ll pp : p) cout << " " << (pp + 1);
    cout << endl;
    string s;
    cin >> s;
    assert(s != "-1");
    return s == "Red" ? 1 : 0;
}

void ans(vb p) {
    cout << "! ";
    for (bool pp : p) {
        cout << (pp ? 'R' : 'B');
    }
    cout << endl;
    exit(0);
}

vl range(ll s, ll k) {
    vl res;
    for (ll i = 0; i < k; ++i) {
        res.pb(s + i);
    }
    return res;
}

int main() {
    cout << fixed << setprecision(20);
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);


    ll n;
    cin >> n;

    if (false) {
        vl p = range(0, n);
        ll last = ask(p);
        ll index = 0;

        for (ll i = 1; i <= n; ++i) {
            vl pp = range(i, n);
            ll curr = ask(pp);
            if (curr == last) { continue; }
            index = i - 1;
            break;
        }
    }

    ll last;
    ll index;
    {
        ll l = 0;
        ll r = n;
        vl values(2);
        values[0] = ask(range(l, n));
        values[1] = ask(range(r, n));

        while (l + 1 < r) {
            ll mid = (l + r) / 2;
            ll value_mid = ask(range(mid, n));
            if (value_mid == values[0]) {
                l = mid;
            } else {
                r = mid;
            }
        }
        index = l;
        last = values[0];
    }

    vb colors(2 * n, false);
    colors[index] = last;
    colors[index + n] = 1 - last;

    for (ll i = 0; i < 2 * n; ++i) {
        if (i >= index && i <= index + n) { continue; }
        vl q = range(index + 1, n - 1);
        q.pb(i);
        colors[i] = ask(q);
    }

    for (ll i = 0; i < 2 * n; ++i) {
        if (i <= index || i >= index + n) { continue; }
        vl q;
        q.pb(i);
        for (ll xx : range(0, index)) { q.pb(xx); }
        for (ll xx : range(index + n + 1, (n - 1) - index)) { q.pb(xx); }
        colors[i] = ask(q);
    }


    ans(colors);
    print_time();
    return 0;
}


Measured memory_bytes: 724