#include <bits/stdc++.h>
using namespace std;
std::mt19937 rnd(
    (int)std::chrono::steady_clock::now().time_since_epoch().count());
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 14;
struct Res {
  vector<vector<int>> ways;
};
int n;
char g[MAXN][MAXN + 1];
;
long long ans[1 << MAXN - 1];
int v[MAXN][MAXN];
int bitcount[1 << MAXN];
int rev[1 << MAXN];
Res calc(vector<int> lst, bool dorev) {
  int m = ((int)(lst).size());
  Res ret;
  ret.ways = vector<vector<int>>(m, vector<int>(1 << (m - 1), 0));
  vector<int> p(m);
  for (int i = (0); i < (m); ++i) p[i] = i;
  do {
    int val = 0;
    for (int i = (0); i < (m - 1); ++i) {
      int a = lst[p[i]], b = lst[p[i + 1]];
      val += v[a][b] << i;
    }
    if (dorev) val = rev[val];
    ++ret.ways[p[m - 1]][val];
  } while (next_permutation(p.begin(), p.end()));
  return ret;
}
void solve() {
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j < (n); ++j) v[i][j] = g[i][j] == '1';
  bitcount[0] = 0;
  for (int i = (1); i < (1 << n); ++i) bitcount[i] = bitcount[i >> 1] + (i & 1);
  int n1 = (n + 1) / 2, n2 = n - n1;
  for (int i = (0); i < (1 << (n - 1)); ++i) ans[i] = 0;
  for (int mask = (0); mask < (1 << (n2 - 1)); ++mask) {
    rev[mask] = 0;
    for (int i = (0); i < ((n2 - 1)); ++i)
      if (mask & (1 << i)) rev[mask] |= 1 << (n2 - 1 - i - 1);
  }
  for (int mask = (0); mask < (1 << n); ++mask)
    if (bitcount[mask] == n1) {
      vector<int> alst, blst;
      for (int i = (0); i < (n); ++i)
        if (mask & (1 << i))
          alst.push_back(i);
        else
          blst.push_back(i);
      Res a = calc(alst, false);
      Res b = calc(blst, true);
      for (int i = (0); i < (((int)(alst).size())); ++i)
        for (int j = (0); j < (((int)(blst).size())); ++j)
          for (int aval = (0); aval < (1 << (n1 - 1)); ++aval)
            for (int bval = (0); bval < (1 << (n2 - 1)); ++bval) {
              int val = aval + (v[alst[i]][blst[j]] << (n1 - 1)) + (bval << n1);
              long long cur = (long long)a.ways[i][aval] * b.ways[j][bval];
              ans[val] += cur;
            }
    }
}
void run() {
  scanf("%d", &n);
  for (int i = (0); i < (n); ++i) scanf("%s", &g[i]);
  solve();
  for (int i = (0); i < (1 << (n - 1)); ++i) {
    if (i != 0) printf(" ");
    printf("%lld", ans[i]);
  }
  puts("");
}
void stress() {
  for (n = MAXN; n <= MAXN; ++n) {
    for (int i = (0); i < (n); ++i)
      for (int j = (0); j < (n); ++j) g[i][j] = i == j ? '0' : '1';
    for (int i = (0); i < (n); ++i) g[i][n] = '\0';
    solve();
    printf("done %d\n", n);
  }
}
int main() {
  run();
  return 0;
}
