#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DEBUG_OUTPUT_ENABLED 1
	#define DBG(X) dout << #X << "=" << (X) << '\n';
	#define SAY(X) dout << (X) << '\n';
#else
	#define DEBUG_OUTPUT_ENABLED 0
	#define DBG(X) 42;
	#define SAY(X) 42;
#endif

#define dout   ___debug::instance

using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const set<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const map<T, S>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const multiset<T>& v) { for(auto el: v) cout << el << " "; return os; }
namespace ___debug {
	struct DebugStream {
		private:
			bool is_first;
		public:
			DebugStream(bool _is_first): is_first(_is_first) {}
			template<typename T> DebugStream operator<<(const T& value) const {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				cout << value;
				return DebugStream(false);
			};

			template<typename T> DebugStream printArray(T* l, T* r) {
				assert(DEBUG_OUTPUT_ENABLED);
				if(is_first) cout << "[DBG] ";
				while(l != r) {
					cout << (*l);
					++l;
					if(l == r) {
						cout << '\n';
					} else {
						cout << ' ';
					}
				}
				return DebugStream(false);
			}
	};
	DebugStream instance(true);
};

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }
template<typename T> inline void makeUnique(vector<T>& v) { sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); }
struct Node {
	int val;
	int go0, go1, go2;
};
vector<Node> V;
int newNode() {
	V.emplace_back();
	return len(V) - 1;
}
void build(int root, int n, int cur, int inc, int depth) {
	if(depth == n) {
		V[root].go0 = V[root].go1 = V[root].go2 = NIL;
		V[root].val = cur;
	} else {
		int A = newNode();
		int B = newNode();
		int C = newNode();
		V[root].go0 = A;
		V[root].go1 = B;
		V[root].go2 = C;
		build(A, n, cur, 3 * inc, depth + 1);
		build(B, n, cur + inc, 3 * inc, depth + 1);
		build(C, n, cur + 2 * inc, 3 * inc, depth + 1);
	}
}
void shift1(int root) {
	if(V[root].go0 == NIL || V[root].go1 == NIL || V[root].go2 == NIL) {
		return;
	}
	int d0 = V[root].go0;
	int d1 = V[root].go1;
	int d2 = V[root].go2;
	V[root].go1 = d0;
	V[root].go2 = d1;
	V[root].go0 = d2;
	shift1(d2);
}
void shift2(int root) {
	if(V[root].go0 == NIL || V[root].go1 == NIL || V[root].go2 == NIL) {
		return;
	}
	int d0 = V[root].go0;
	int d1 = V[root].go1;
	int d2 = V[root].go2;
	V[root].go2 = d0;
	V[root].go0 = d1;
	V[root].go1 = d2;
	shift2(d1);
}
int answ[1000 * 1000];
void show1(int root, int cur, int inc) {
	if(V[root].go0 == NIL || V[root].go1 == NIL || V[root].go2 == NIL) {
		answ[V[root].val] = cur;	
	} else {
		show1(V[root].go0, cur, 3 * inc);
		show1(V[root].go1, cur + inc, 3 * inc);
		show1(V[root].go2, cur + 2 * inc, 3 * inc);
	}
}
void show2(int root, int cur, int inc) {
	if(V[root].go0 == NIL || V[root].go1 == NIL || V[root].go2 == NIL) {
		answ[V[root].val] = cur;	
	} else {
		show2(V[root].go0, cur, 3 * inc);
		show2(V[root].go2, cur + inc, 3 * inc);
		show2(V[root].go1, cur + 2 * inc, 3 * inc);
	}
}
void solve() {
	int n = fetch<int>();
	int root = newNode();
	build(root, n, 0, 1, 0);
	auto cmd = fetch<string>();
	int flag = 1;
	for(auto& ch: cmd) {
		if(ch == 'S') {
			flag ^= 1;
		} else if(ch == 'R') {
			if(flag) {
				shift1(root);
			} else {
				shift2(root);
			}
		} else {
			assert(false);
		}
	}
	if(flag) {
		show1(root, 0, 1);
	} else {
		show2(root, 0, 1);
	}
	int mod = 1;
	for(int i = 0; i < n; ++i) {
		mod *= 3;
	}
	for(int i = 0; i < mod; ++i) {
		cout << answ[i] << ' ';
	}
	cout << '\n';
}

int main() {
	fast_io();
	solve();

	return 0;
}



Measured memory_bytes: 19748