//satyaki3794
#include <bits/stdc++.h>
#define pb push_back

using namespace std;
typedef long long ll;


int n, reachable[(1<<14)+2][15];;
vector<int> adj[20];
ll DP[(1<<14)+2][15];

int dfs(int mask, int v){

    int &ans = reachable[mask][v];
    if(ans != -1)   return ans;

    ans = (1<<v);
    for(auto vv : adj[v]){
        if((mask >> vv) & 1)    continue;
        ans |= dfs(mask|(1<<vv), vv);
    }
    return ans;
}

ll dp(int mask, int v){
    ll &ans = DP[mask][v];
    if(ans != -1)   return ans;
    if(reachable[mask][v] == (1<<v)){
        return 1;
    }
    ans = 0;
    for(auto vv : adj[v]){
        if((mask >> vv) & 1)    continue;
        ans += dp(mask|(1<<vv), vv) * dp(mask|(reachable[mask|(1<<vv)][vv]), v);
    }
    return ans;
}



class DFSCount{
    public:
        ll count(vector<string> G){

            n = (int)G.size();
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(G[i][j] == 'Y')
                        adj[i].pb(j);


            memset(reachable, -1, sizeof(reachable));
            for(int mask=0;mask<(1<<n);mask++)
                for(int i=0;i<n;i++)
                    if((mask >> i) & 1){
                        reachable[mask][i] = dfs(mask, i);
                    }

            memset(DP, -1, sizeof(DP));
            ll ans = 0;
            for(int i=0;i<n;i++)
                ans += dp((1<<i), i);
            return ans;
        }
};
