/*
TASK:flower
LANG:C++
*/

#include <cstdio>
#include <cstring>

const int MAXN = 1 << 7;
const int MAX = 16;
#warning fix this
const int BASE = /*10;*/1000000000;
//typedef long long big;

struct big {
	int m[MAX];
	big (int a =0) {memset (m, 0, sizeof (m)); m[0] = a;}
	big (const big &a) {memcpy (m, a.m, sizeof (m));}
	big operator + (const big &a) const {
		static big res;
		int pr = 0, i;
		for (i = 0; i < MAX; ++i) {
			res.m[i] = m[i] + a.m[i] + pr;
			pr = res.m[i] / BASE;
			res.m[i] %= BASE;
		}

		return res;
	}
	big operator * (const big &a) const {
//		printf ("mull :"); a.prnt (); putchar (' '); prnt (); puts ("");
		static int i, j, jj;
		static long long tmp, pr;
		static big res;
		res = 0;
		for (i = 0; i < MAX; ++i)
			for (j = 0; j + i < MAX; ++j) {
				tmp = (long long)m[i] * (long long)a.m[j];
//				printf ("%d %d -> %Ld\n", i, j, tmp);
				res.m[i + j] += tmp % (long long)BASE;
				pr = tmp / (long long)BASE + (res.m[i + j] >= BASE);
				res.m[i + j] %= BASE;
//				printf ("pr == %Ld\n", pr);
				jj = 0;
				while (pr) {++jj;// printf ("writin pr(%Ld) to %d\n", pr, i + j + jj);
				res.m[i + j + jj] += pr; pr = res.m[i + j + jj] / BASE; res.m[i + j + jj] %= BASE;}
//				res.prnt (); puts ("!!!\n");
			}
		return res;
	}

	void prnt () const {
		static int i;
		for (i = MAX-1; i && !m[i]; --i);
		printf ("%d", m[i]);
		for (--i; i >= 0; --i) printf ("%09d", m[i]);
								//printf ("%d", m[i]);
	}
};

int N;
int N1, N2;
big C[MAXN][MAXN];


big _dp_res;
void dpf (int _N) {
	static big dp[MAXN][MAXN];
	static int i, j;
//	printf ("!!%d\n", _N);
	for (i = 0; i <= _N; ++i) for (j = 0; j <= _N; ++j) dp[i][j] = 0;
	dp[_N][0] = 1;
	for (i = _N-1; i >= 0; --i) {
		dp[i][0] = dp[i+1][1];
//		printf ("-- %d %d -- %Ld\n", i, 0, dp[i][0]);
		for (j = 1; j < _N; ++j) {
			dp[i][j] = dp[i+1][j-1] + dp[i+1][j+1];
//			printf ("-- %d %d -- %Ld (%Ld %Ld)\n", i, j, dp[i][j], dp[i+1][j-1], dp[i+1][j+1]);
		}
	}
	_dp_res = dp[0][0];
}

void Cf () {
	static int i, j;
	for (i = 0; i < MAXN; ++i) C[1][i] = 1;
	for (i = 2; i < MAXN; ++i) {
		C[i][0] = 1;
		for (j = 1; j < MAXN; ++j) {
			C[i][j] = C[i-1][j] + C[i][j-1];
//			if (i < 10 && j < 10) printf ("%d %d -- %Ld\n", i, j, C[i][j]);
		}
	}
}

int main () {
	scanf ("%d", &N);
	char dir[4];
	for (int i = 0; i < N; ++i) {
		scanf ("%s", dir);
		if (dir[0] == 'W')
			++N1;
		else if (dir[0] == 'N')
			++N2;
	}

	Cf ();
	dpf (N1 * 2); big mul1 = _dp_res;
	dpf (N2 * 2); big mul2 = _dp_res;
	big res = mul1 * mul2;
	res = res * C[N1 * 2 + 1][N2 * 2];
	int i;
	for (i = 0; i < MAX && !res.m[i]; ++i) res.m[i] = BASE - 1;
	--res.m[i];
//	C[N1 * 2 + 1][N2 * 2].prnt (); puts ("");
//	mul1.prnt (); puts ("");
//	mul2.prnt (); puts ("");
	res.prnt (); puts ("");
//	printf ("%Ld(%Ld(%d %d) %Ld %Ld)\n", res, C[N1 * 2 + 1][N2 * 2], N1 * 2 + 1, N2 * 2, mul1, mul2);

	return 0;
}
