#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
  for (auto &x : v) is >> x;
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, vector<T> &v) {
  for (int i = 0; i < v.size(); i++) {
    cout << v[i];
    if (i != v.size() - 1) cout << endl;
  };
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> p) {
  cout << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T>
void Out(T x) {
  cout << x << endl;
}
template <typename T1, typename T2>
void Ans(bool first, T1 y, T2 n) {
  if (first)
    Out(y);
  else
    Out(n);
}
using vec = vector<int>;
using mat = vector<vec>;
using Pii = pair<int, int>;
using PiP = pair<int, Pii>;
using PPi = pair<Pii, int>;
using bools = vector<bool>;
using pairs = vector<Pii>;
const int mod = 1000000007;
signed main() {
  int n;
  cin >> n;
  vector<string> s_(n);
  cin >> s_;
  bool second[14][14] = {};
  for (int i = (0), i_end_ = (n); i < i_end_; i++)
    for (int j = (0), j_end_ = (n); j < j_end_; j++)
      if (s_[i][j] == '1') second[i][j] = true;
  if (n == 2) {
    if (second[0][1]) {
      cout << 0 << ' ' << 2 << endl;
    } else {
      cout << 2 << ' ' << 0 << endl;
    }
    return 0;
  }
  int k = n / 2 + 1;
  vec cnt1((1 << (k - 1))), cnt2((1 << (n - k)));
  vector<long long> ans((1 << (n - 1)));
  for (int a = (0), a_end_ = (n); a < a_end_; a++) {
    int comb = (1 << (k)) - 1;
    while (comb < (1 << (n))) {
      fill(cnt1.begin(), cnt1.end(), 0);
      fill(cnt2.begin(), cnt2.end(), 0);
      if ((comb >> a) & 1) {
        int rev = ((1 << (n)) - 1) ^ comb ^ (1 << (a));
        vec v, w;
        for (int i = (0), i_end_ = (n); i < i_end_; i++)
          if (i != a) {
            if ((comb >> i) & 1)
              v.push_back(i);
            else if ((rev >> i) & 1)
              w.push_back(i);
          }
        const int sv = ((int)v.size()), sw = ((int)w.size());
        do {
          int val = 0;
          if (second[v[0]][a]) val++;
          for (int i = (0), i_end_ = (sv - 1); i < i_end_; i++) {
            val <<= 1;
            if (second[v[i]][v[i + 1]]) val++;
          }
          cnt1[val]++;
        } while (next_permutation(v.begin(), v.end()));
        do {
          int val = 0;
          for (int i = (0), i_end_ = (sw - 1); i < i_end_; i++) {
            if (second[w[i]][w[i + 1]]) val++;
            val <<= 1;
          }
          if (second[a][w[sw - 1]]) val++;
          cnt2[val]++;
        } while (next_permutation(w.begin(), w.end()));
        for (int i = (0), i_end_ = ((1 << (sv))); i < i_end_; i++)
          if (cnt1[i]) {
            for (int j = (0), j_end_ = ((1 << (sw))); j < j_end_; j++)
              ans[i ^ (j << sv)] += cnt1[i] * cnt2[j];
          }
      }
      int x = comb & -comb, y = comb + x;
      comb = ((comb & ~y) / x >> 1) | y;
    }
  }
  for (auto x : ans) cout << x << ' ';
  cout << endl;
  return 0;
}
