#include "bits/stdc++.h"
using namespace std;
#ifdef _DEBUG
#include "dump.hpp"
#else
#define dump(...)
#endif

#define int long long
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define all(c) begin(c),end(c)
const int INF = sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = 1000000007;
template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

template<typename T>
vector<T> gen_v(size_t a) { return vector<T>(a); }
template<typename T, typename ...Ts>
auto gen_v(size_t a, Ts... ts) { return vector<decltype(gen_v<T>(ts...))>(a, gen_v<T>(ts...)); }
template<typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type
fill_v(T &t, const V &v) { t = v; }
template<typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type
fill_v(T &t, const V &v) { for (auto &e : t) fill_v(e, v); }

template<class T, class ...Tail>
void tiedSort(vector<T> &a, vector<Tail>&... tail) {
	int n = a.size();
	using S = tuple<T, Tail...>;
	vector<S> s(n);
	for (int i = 0; i < n; i++)
		s[i] = make_tuple(a[i], tail[i]...);
	sort(s.begin(), s.end());
	for (int i = 0; i < n; i++)
		tie(a[i], tail[i]...) = s[i];
}

struct InteractiveProblem {
	const int N;
	const int MAX_Q = 210;
	int q;
	vector<int> is_red;
	bool to_server;
	InteractiveProblem(int n, bool to_server) :N(n), q(0), is_red(2 * N), to_server(to_server) {
		random_device rd;
		mt19937 mt(rd());
		set<int> st;
		while (st.size() < N)
			st.emplace(mt() % (2 * N));
		for (auto i : st) {
			is_red[i] = true;
		}
	}
	bool question(vector<int> A) {
		assert(A.size() == N);
		if (to_server) {
			cout << "?";
			rep(i, 0, A.size())
				cout << " " << A[i] + 1;
			cout << endl;
			string res; cin >> res;
			assert(res != "-1");
			return res[0] == 'R';
		}
		else {
			assert(q < MAX_Q);
			q++;

			int cnt = 0;
			for (auto i : A) {
				if (is_red[i])
					cnt++;
			}
			dump(cnt);
			return cnt >= N / 2 + 1;
		}
	}
	void judge(vector<int> ans) {
		if (to_server)return;
		int correct = 0;
		rep(i, 0, 2 * N) {
			if (ans[i] == -1)continue;
			dump(ans[i] == 1, is_red[i]);
			if (ans[i] == is_red[i])correct++;
		}
		dump(correct);
	}
};

void sim() {
	int N = 99;
	InteractiveProblem IP(N, false);

	auto f = [&](int x) {
		dump(x);
		vector<int> A(N);
		rep(i, 0, N) {
			A[i] = (i + x) % (2 * N);
		}
		bool ret = IP.question(A);
		dump(ret);
		return ret;
	};
	auto bisectionMethod = [&](int ng, int ok) {
		while (ng + 1 < ok) {
			int m = (ng + ok) / 2;
			if (f(m))
				ok = m;
			else
				ng = m;
		}
		return ok;
	};

	vector<int> A(N);
	iota(all(A), 0);
	bool res = IP.question(A);
	dump(res);
	int l = 0, r = N;
	if (res) {
		l = N, r = 2 * N;
	}
	dump(l, r);
	auto x = bisectionMethod(l, r);
	dump(x);
	dump(f(x - 1));
	dump(f(x));

	int l1 = x, r1 = x + N - 1;

	vector<int> a(2 * N, -1);

	rep(i, 0, N - 1) {
		A[i] = (l1 + i) % (2 * N);
	}
	rep(i, 0, N + 1) {
		int x = (r1 + i) % (2 * N);
		A.back() = x;
		a[x] = IP.question(A);
	}
	dump(a);

	A.clear();
	int red = 0, blue = 0;
	rep(i, 0, 2 * N) {
		if (a[i] == -1)continue;
		if (red < N / 2 && a[i]) {
			A.push_back(i); red++;
		}
		if (blue < N / 2 && !a[i]) {
			A.push_back(i); blue++;
		}
	}
	A.push_back(-1);

	rep(i, 0, 2 * N) {
		if (a[i] != -1)continue;
		A.back() = i;
		a[i] = IP.question(A);
	}
	dump(a);

	IP.judge(a);
}

signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	//sim();

	int N; cin >> N;
	InteractiveProblem IP(N, true);

	auto f = [&](int x) {
		dump(x);
		vector<int> A(N);
		rep(i, 0, N) {
			A[i] = (i + x) % (2 * N);
		}
		bool ret = IP.question(A);
		dump(ret);
		return ret;
	};
	auto bisectionMethod = [&](int ng, int ok) {
		while (ng + 1 < ok) {
			int m = (ng + ok) / 2;
			if (f(m))
				ok = m;
			else
				ng = m;
		}
		return ok;
	};

	vector<int> A(N);
	iota(all(A), 0);
	bool res = IP.question(A);
	dump(res);
	int l = 0, r = N;
	if (res) {
		l = N, r = 2 * N;
	}
	dump(l, r);
	auto x = bisectionMethod(l, r);
	dump(x);

	int l1 = x, r1 = x + N - 1;

	vector<int> a(2 * N, -1);

	rep(i, 0, N - 1) {
		A[i] = (l1 + i) % (2 * N);
	}
	rep(i, 0, N + 1) {
		int x = (r1 + i) % (2 * N);
		A.back() = x;
		a[x] = IP.question(A);
	}
	dump(a);

	A.clear();
	int red = 0, blue = 0;
	rep(i, 0, 2 * N) {
		if (a[i] == -1)continue;
		if (red < N / 2 && a[i]) {
			A.push_back(i); red++;
		}
		if (blue < N / 2 && !a[i]) {
			A.push_back(i); blue++;
		}
	}
	A.push_back(-1);

	rep(i, 0, 2 * N) {
		if (a[i] != -1)continue;
		A.back() = i;
		a[i] = IP.question(A);
	}
	dump(a);

	cout << "! ";
	rep(i, 0, 2 * N) {
		cout << (a[i] == 1 ? "R" : "B");
	}
	cout << endl;

	return 0;
}

Measured memory_bytes: 724