#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T>
using MaxHeap = priority_queue<T>;
template <class T>
using MinHeap = priority_queue<T, vector<T>, greater<T>>;
const double PI = 3.141592653589793238462643383279;
const ll MOD = 1e9 + 7;
const ll INF = 1LL << 55;
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 (a > b) {
    a = b;
    return true;
  }
  return false;
}
vector<ll> dp[14][1 << 14];
signed main() {
  cin.sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ll N;
  cin >> N;
  vector<vector<ll>> table(N, vector<ll>(N));
  for (ll i = 0; i < N; i++) {
    string str;
    cin >> str;
    for (ll j = 0; j < N; j++) {
      table[i][j] = str[j] - '0';
    }
  }
  for (ll i = 0; i < N; i++) {
    for (ll mask = 1; mask < (1 << N); mask++) {
      ll cnt = __builtin_popcount(mask);
      if (cnt < 2) continue;
      dp[i][mask].resize(1 << (cnt - 1), 0);
    }
  }
  for (ll i = 0; i < N; i++) {
    for (ll mask = 0; mask < (1 << N); mask++) {
      if (!((1 << i) & mask)) continue;
      ll cnt = __builtin_popcount(mask);
      if (cnt != 2) continue;
      vector<ll> nodes;
      for (ll i = 0; i < N; i++)
        if ((mask >> i) & 1) nodes.push_back(i);
      dp[i][mask][table[nodes[0]][nodes[1]]] = 1;
    }
  }
  for (ll mask = 0; mask < (1 << N); mask++) {
    for (ll i = 0; i < N; i++) {
      if (!((mask >> i) & 1)) continue;
      ll cnt = __builtin_popcount(mask);
      if (cnt < 2) continue;
      for (ll mask2 = 0; mask2 < (1 << (cnt - 1)); mask2++) {
        if (!dp[i][mask][mask2]) continue;
        for (ll next = 0; next < N; next++) {
          if ((mask >> next) & 1) continue;
          ll val = table[i][next];
          if (val) val <<= cnt - 1;
          dp[next][mask | (1 << next)][mask2 | val] += dp[i][mask][mask2];
        }
      }
    }
  }
  vector<ll> ans((1 << (N - 1)), 0);
  for (ll mask = 0; mask < (1 << (N - 1)); mask++) {
    ll rev = 0;
    for (ll i = 0; i < N - 1; i++) {
      if ((mask >> i) & 1) {
        ll j = N - 2 - i;
        rev += (1 << j);
      }
    }
    for (ll i = 0; i < N; i++) {
      ans[mask] += dp[i][(1 << N) - 1][rev];
    }
  }
  for (ll mask = 0; mask < (1 << (N - 1)); mask++) {
    cout << ans[mask] << endl;
  }
  return 0;
}
