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

#include <stdio.h>
#include <string.h>

#define DC 50
class vln
{
private:
  unsigned long dig[DC];
public:
  void print(void);
  vln dec(void);
  long operator%(long a);
  vln operator/=(long a);
  vln operator*(const vln &a)const;
  vln operator*(unsigned long a)const;
  vln operator=(unsigned long long a);
  vln operator*=(unsigned long a);
  vln operator+=(const vln &a);
  vln operator+(const vln &a);
};

long vln::operator%(long a)
{
  short i;
  long long t=0;
  for(i=DC-1; i>=0; --i)
  {
    t+=dig[i];
    t%=a;
  }
  return t;
}

vln vln::operator/=(long a)
{
  short i;
  long long t=0;
  for(i=DC-1; i>=0; --i)
  {
    t+=dig[i];
    dig[i]=t/a;
    t%=a;
  }
  return *this;
}

vln vln::dec(void)
{
  char borrow=1;
  short i;
  for(i=0; i<DC; ++i)
    if(dig[i]>=borrow)
    {
      dig[i]-=borrow;
      borrow=0;
    }
    else
    {
      dig[i]=999999999-borrow;
      borrow=1;
    }
}

vln vln::operator*(const vln &a)const
{
  char i;
  vln res;
  res=a*dig[DC-1];
  for(i=DC-2; i>=0; --i)
  {
    res*=1000000000;
    res+=a*dig[i];
  }
  return res;
}

vln vln::operator*(unsigned long a)const
{
  vln res;
  res=*this;
  res*=a;
  return res;
}

vln vln::operator+(const vln &a)
{
  vln t;
  t=*this;
  t+=a;
  return t;
}

vln vln::operator*=(unsigned long a)
{
  char i;
  long long t=0;
  for(i=0; i<DC; ++i)
  {
    t+=(long long)dig[i]*a;
    dig[i]=t%1000000000;
    t/=1000000000;
  }
  return *this;
}

void vln::print(void)
{
  char i;
  for(i=DC-1; i&&!dig[i]; --i);
  if(i==DC)
    printf("0");
  printf("%lu", dig[i]);
  for(--i; i>=0; --i)
    printf("%09lu", dig[i]);
}

vln vln::operator=(unsigned long long a)
{
  char i;
  for(i=0; i<DC; ++i)
  {
    dig[i]=a%1000000000;
    a/=1000000000;
  }
  return *this;
}

vln vln::operator+=(const vln &a)
{
  char i;
  long long t=0;
  for(i=0; i<DC; ++i)
  {
    t+=((long long)dig[i])+((long long)a.dig[i]);
    dig[i]=t%1000000000;
    t/=1000000000;
  }
  return *this;
}
#undef DC

short n;
vln f[101][101];

vln calcf(short x)
{
  char i, j;
  memset(f, 0, 10201*sizeof(long));
  f[1][1]=1;
  for(i=2; i<=x; ++i)
    for(j=1; j<=i&&j<=x/2; ++j)
      if(i<=j<<1)
        f[i][j]=f[i-1][j-1]+f[i-1][j];
  return f[x][x/2];
}

vln fact(short n, short k)
{
  char divs[100];
  short i, j;
  vln res;
  res=1;
  if(k<n/2)
    k=n-k;
  memset(divs, 0, 100);
  memset(divs, 1, (n-k)*sizeof(char));
  for(i=k+1; i<=n; ++i)
  {
    res*=i;
    for(j=1; j<n; ++j)
      if(divs[j]&&res%(j+1)==0)
      {
        res/=j+1;
        divs[j]=0;
      }
  }
  return res;
}

int main(void)
{
  char ch;
  short n, k=0;
  scanf("%hd", &n);
  while((ch=getchar())!=EOF)
    if(ch=='N')
      ++k;
  k*=2;
  vln r;
  r=calcf(k)*calcf(n-k)*fact(n, k);
  r.dec();
  r.print();
  printf("\n");
  return 0;
}

