#include <bits/stdc++.h>
using namespace std;
int n, k;
int M[15][15];
unsigned long long score[10000];
int a[10], b[10];
int fact1, fact2;
int perms1[6000][8], perms2[6000][8];
void gen_perms(int m, vector<vector<int> > &perms) {
  if (m == 1) {
    vector<int> v;
    v.push_back(1);
    perms.push_back(v);
    return;
  }
  vector<vector<int> > prev_perms;
  gen_perms(m - 1, prev_perms);
  for (vector<int> v : prev_perms) {
    for (int i = 0; i < m; i++) {
      vector<int> vnew;
      for (int j = 0; j < i; j++) {
        vnew.push_back(v[j]);
      }
      vnew.push_back(m);
      for (int j = i; j < m - 1; j++) {
        vnew.push_back(v[j]);
      }
      perms.push_back(vnew);
    }
  }
}
unsigned long long counts1[20][200], counts2[20][200];
void count_sols() {
  int bpos = 0;
  int apos = 0;
  for (int i = 0; i < n; i++) {
    while (a[apos] < i) {
      apos++;
    }
    if (a[apos] > i) {
      b[bpos] = i;
      bpos++;
    }
  }
  int first_end, first_val;
  int *perm;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 128; j++) {
      counts1[i][j] = 0;
      counts2[i][j] = 0;
    }
  }
  for (int i = 0; i < fact1; i++) {
    perm = perms1[i];
    first_end = a[perm[k - 1]];
    first_val = 0;
    for (int j = 0; j < k - 1; j++) {
      first_val <<= 1;
      first_val += M[a[perm[j]]][a[perm[j + 1]]];
    }
    counts1[first_end][first_val]++;
  }
  int second_end, second_val, k2 = n - k;
  for (int i = 0; i < fact2; i++) {
    perm = perms2[i];
    second_end = b[perm[0]];
    second_val = 0;
    for (int j = 0; j < k2 - 1; j++) {
      second_val <<= 1;
      second_val += M[b[perm[j]]][b[perm[j + 1]]];
    }
    counts2[second_end][second_val]++;
  }
  int bucket;
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < n - k; j++) {
      first_end = a[i];
      second_end = b[j];
      for (int u = 0; u < (1 << (k - 1)); u++) {
        for (int v = 0; v < (1 << (k2 - 1)); v++) {
          bucket = (u << k2) + ((M[first_end][second_end]) << (k2 - 1)) + v;
          score[bucket] += counts1[first_end][u] * counts2[second_end][v];
        }
      }
    }
  }
}
void rec_count(int spos, int sval) {
  if (spos == k) {
    a[spos] = 2020;
    count_sols();
    return;
  }
  for (int v = sval; v < n; v++) {
    a[spos] = v;
    rec_count(spos + 1, v + 1);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  string s;
  for (int i = 0; i < n; i++) {
    cin >> s;
    for (int j = 0; j < n; j++) {
      M[i][j] = (s[j] == '1');
    }
  }
  k = n / 2;
  vector<vector<int> > p1, p2;
  gen_perms(k, p1);
  for (int i = 0; i < p1.size(); i++) {
    for (int j = 0; j < k; j++) {
      perms1[i][j] = p1[i][j] - 1;
    }
  }
  gen_perms(n - k, p2);
  for (int i = 0; i < p2.size(); i++) {
    for (int j = 0; j < n - k; j++) {
      perms2[i][j] = p2[i][j] - 1;
    }
  }
  fact1 = p1.size();
  fact2 = p2.size();
  rec_count(0, 0);
  cout << score[0];
  for (int i = 1; i < (1 << (n - 1)); i++) {
    cout << " " << score[i];
  }
  cout << "\n";
  return 0;
}
