#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }
const int MAXN = 3e5 + 10;
void solve(int tt) {}
string s[100];
int g[100][100];
vector<vector<long long> > dp[1 << 14];
unordered_map<int, vector<int> > masks;
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n;
  cin >> n;
  for (auto i = (0); i < (n); i++) cin >> s[i];
  for (auto i = (0); i < (n); i++)
    for (auto j = (0); j < (n); j++) g[i][j] = s[i][j] - '0';
  for (int mask = 0; mask < (1 << n); mask++) {
    int k = __builtin_popcount(mask);
    masks[k].push_back(mask);
  }
  for (auto kk = (1); kk < (n + 1); kk++) {
    ;
    ;
    for (auto mask : masks[kk]) {
      dp[mask] =
          vector<vector<long long> >(14, vector<long long>(1 << (kk - 1)));
      int k = kk;
      for (auto p = (0); p < (n); p++) {
        if (!((1 << p) & mask)) continue;
        if (k == 1)
          dp[mask][p][0] = 1;
        else {
          for (auto q = (0); q < (n); q++) {
            if (p == q) continue;
            if (!((1 << q) & mask)) continue;
            for (auto ss = (0); ss < (1 << (k - 2)); ss++) {
              dp[mask][p][(ss << 1) + g[p][q]] += dp[mask - (1 << p)][q][ss];
            }
          }
        }
      }
    }
  }
  for (auto ss = (0); ss < (1 << (n - 1)); ss++) {
    long long ans = 0;
    int mask = (1 << n) - 1;
    for (auto p = (0); p < (n); p++) {
      ans += dp[mask][p][ss];
    }
    cout << ans << ' ';
  }
  cout << '\n';
  return 0;
}
