#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << endl; }
template <class T>
ostream& prnt(ostream& out, T v) {
  out << v.size() << '\n';
  for (auto e : v) out << e << ' ';
  return out;
}
template <class T>
ostream& operator<<(ostream& out, vector<T> v) {
  return prnt(out, v);
}
template <class T>
ostream& operator<<(ostream& out, set<T> v) {
  return prnt(out, v);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, map<T1, T2> v) {
  return prnt(out, v);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> p) {
  return out << '(' << p.first << ' ' << p.second << ')';
}
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << H;
  debug_out(T...);
}
const long double PI = acos(-1);
int n, DP[2][1 << 14][1 << 7][15];
char s[20][20];
long long ans[1 << 14];
long long mem[1 << 8][15];
void solve(int DP[1 << 14][1 << 7][15], int st, int dr) {
  int lg = dr - st;
  int mx1 = (1 << lg);
  int mx2 = (1 << n);
  for (int mskA = 0; mskA < mx1; mskA++) {
    for (int mskB = 1; mskB < mx2; mskB++) {
      int x = __builtin_popcount(mskB) - 1;
      if (x > lg) continue;
      for (int lst = 0; lst < n; lst++) {
        if (!(mskB & (1 << lst))) continue;
        if (x == 0) {
          DP[mskB][mskA][lst] = 1;
          break;
        }
        for (int crt = 0; crt < n; crt++) {
          if (!(mskB & (1 << crt))) continue;
          if (crt == lst) continue;
          if (((mskA & (1 << (x - 1))) != 0) != (s[lst][crt] - '0')) continue;
          DP[mskB][mskA][crt] += DP[mskB ^ (1 << crt)][mskA][lst];
        }
      }
    }
  }
}
int rev(int a, int b) {
  if (mem[a][b] != -1) {
    return mem[a][b];
  }
  int ans = 0;
  for (int i = 0; i < b; i++)
    if (a & (1 << i)) ans |= (1 << (b - i - 1));
  return mem[a][b] = ans;
}
void brut() {
  int v[14];
  int p = 1;
  for (int i = 1; i <= n; i++) {
    p *= i;
    v[i] = i;
  }
  while (p--) {
    int x = 0;
    for (int i = 2; i <= n; i++) {
      x *= 2;
      x += s[v[i - 1] - 1][v[i] - 1] - '0';
    }
    ans[x]++;
    next_permutation(v + 1, v + n + 1);
  }
  int mx = (1 << (n - 1));
  for (int i = 0; i < mx; i++) {
    cout << ans[i] << ' ';
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  memset(mem, 0xff, sizeof(mem));
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  if (n < 4) {
    brut();
    return 0;
  }
  int N = n;
  int a = N / 2;
  int b = N - a;
  solve(DP[0], 0, a - 1);
  solve(DP[1], a, N - 1);
  b--;
  a--;
  int mx1 = 1 << a;
  int mx2 = 1 << b;
  int mx = (1 << n) - 1;
  for (int i = 0; i < mx1; i++) {
    for (int it = 0; it < (1 << n); it++) {
      if (__builtin_popcount(it) != a + 1) continue;
      for (int l1 = 0; l1 < n; l1++) {
        if (DP[0][it][i][l1] == 0) continue;
        for (int l2 = 0; l2 < n; l2++) {
          int it2 = mx ^ it;
          if (!(it2 & (1 << l2))) continue;
          for (int j = 0; j < mx2; j++) {
            int bit = s[l1][l2] - '0';
            int val = (((rev(i, a) << 1) + bit) << b) + j;
            ans[val] += 1LL * DP[0][it][i][l1] * DP[1][it2][j][l2];
          }
        }
      }
    }
  }
  mx = 1 << (n - 1);
  for (int i = 0; i < mx; i++) {
    cout << ans[i] << ' ';
  }
  return 0;
}
