#include <bits/stdc++.h>
using namespace std;

#define PII pair<int, int>
#define VI vector<int>
#define VPII vector<PII>
#define LL long long
#define LD long double
#define f first
#define s second
#define MP make_pair
#define PB push_back
#define endl '\n'
#define ALL(c) (c).begin(), (c).end()
#define SIZ(c) (int)(c).size()
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define FOR(i, b, e) for (int i = (b); i <= (int)(e); i++)
#define FORD(i, b, e) for (int i = (b); i >= (int)(e); i--)
#define ll long long
#define st f
#define nd s
#define pb PB
#define eb emplace_back
#define mp make_pair				
#define siz(c) SIZ(c)
const int inf = 1e9 + 7;
const LL INF = 1e18L + 7;
 
#define sim template<class n
sim, class s> ostream & operator << (ostream &p, pair<n, s> x)
{return p << "<" << x.f << ", " << x.s << ">";}
sim> auto operator << (ostream &p, n y) ->
typename enable_if<!is_same<n, string>::value, decltype(y.begin(), p)>::type
{int o = 0; p << "{"; for (auto c : y) {if (o++) p << ", "; p << c;} return p << "}";}
void dor() {cerr << endl;}
sim, class...s> void dor(n p, s...y) {cerr << p << " "; dor(y...);}
sim, class s> void mini(n &p, s y) {if (p > y) p = y;}
sim, class s> void maxi(n &p, s y) {if (p < y) p = y;}

#ifdef DEB
#define debug(...) dor(__FUNCTION__, ":", __LINE__, ": ", __VA_ARGS__)
#else
#define debug(...)
#endif

#define I(x) #x " = ", (x), " "
#define A(a, i) #a "[" #i " = ", i, "] = ", a[i], " "

#ifndef LOCAL
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;

template <typename T>
using ordered_set =
	tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#else
#include</Users/dawid/algo/mac/ordered_set>
#endif

const int N = 107;

int n;

int ans[2*N];

VI segment(int p)
{
	VI ans;

	for(int i = p; i < p+n; ++i)
		ans.pb(i);

	return ans;
}

int ask(VI v) //B = 0, R = 1
{
	cout << "? ";

	for(auto it:v)
		cout << it << " ";

	cout << endl;
	fflush(stdout);

	string ans;
	cin >> ans;
	return ans == "Red";
}

int32_t main()
{
	cin >> n;

	int pozycja = -1, jaki = -1;

	int first = ask(segment(1));

	int l = 2, r = n+1;

	while(l<r)
	{
		int m = (l+r)/2;

		if(ask(segment(m))!=first)
			r = m;
		else
			l = m+1;
	}

	pozycja = l-1;

	if(first)
		jaki = 1;
	else
		jaki = 0;

	ans[pozycja] = jaki;
	ans[pozycja+n] = (jaki^1);

	/*for(int i = 2; i + n - 1 <= 2 * n; ++i)
	{
		int curr = ask(segment(i));

		if(last != curr)
		{
			pozycja = i-1;

			if(last)
				jaki = 1;
			else
				jaki = 0;

			ans[pozycja] = jaki;
			ans[pozycja+n] = (jaki^1);
			break;
		}

		last = curr;
	}*/

	VI rowno;

	for(int i = pozycja+1; i <= pozycja+n-1; ++i)
	{
		rowno.pb(i);
	}

	for(int i = 1; i <= 2*n; ++i)
	{
		if(i<pozycja || i>pozycja+n)
		{
			rowno.pb(i);
			ans[i] = ask(rowno);
			rowno.pop_back();
		}
	}

	VI pyk = rowno;
	pyk.pb(pozycja);
	pyk.pb(pozycja+n);

	for(int i = pozycja+1; i <= pozycja+n-1; ++i)
	{
		pyk.erase(remove(ALL(pyk), i), pyk.end());
		ans[i] = (ask(pyk)^1);
		pyk.pb(i);

	}

	cout << "! ";

	for(int i = 1; i <= 2*n; ++i)
	{
		if(ans[i])
			cout << "R";
		else
			cout << "B";
	}

	cout << endl;
	fflush(stdout);
}


Measured memory_bytes: 724