#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 = 18;
void inc(long long &a, long long b) { a += b; }
void dec(long long &a, long long b) { a -= b; }
int n;
char s[MAXN][MAXN + 1];
int g[MAXN][MAXN];
int bitcount[1 << MAXN];
long long dpgroup[1 << MAXN][MAXN];
long long subgroup[MAXN + 1][1 << MAXN];
long long ans[1 << (MAXN - 1)];
long long prod[MAXN + 1][1 << MAXN];
int group[MAXN], ngroup;
void rec(int rem) {
  if (rem == 0) {
    long long cur = 0;
    for (int mask = (0); mask < (1 << n); ++mask)
      if ((n - bitcount[mask]) % 2 == 0)
        inc(cur, prod[ngroup][mask]);
      else
        dec(cur, prod[ngroup][mask]);
    vector<int> p(ngroup);
    for (int i = (0); i < (ngroup); ++i) p[i] = group[i];
    sort(p.begin(), p.end());
    do {
      int val = 0;
      for (int i = (0); i < (((int)(p).size())); ++i) {
        val = val * 2;
        for (int j = (0); j < (p[i] - 1); ++j) val = 2 * val + 1;
      }
      inc(ans[val], cur);
    } while (next_permutation(p.begin(), p.end()));
  } else {
    int lim = rem;
    if (ngroup > 0) lim = min(lim, group[ngroup - 1]);
    for (int i = (1); i <= (lim); ++i) {
      for (int mask = (0); mask < (1 << n); ++mask)
        prod[ngroup + 1][mask] = prod[ngroup][mask] * subgroup[i][mask];
      group[ngroup++] = i;
      rec(rem - i);
      --ngroup;
    }
  }
}
void solve() {
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j < (n); ++j) g[i][j] = s[i][j] == '1' ? 1 : 0;
  bitcount[0] = 0;
  for (int mask = (1); mask < (1 << n); ++mask)
    bitcount[mask] = bitcount[mask >> 1] + (mask & 1);
  for (int mask = (0); mask < (1 << n); ++mask)
    for (int i = (0); i < (n); ++i) dpgroup[mask][i] = 0;
  for (int i = (0); i < (n); ++i) dpgroup[1 << i][i] = 1;
  for (int mask = (0); mask < (1 << n); ++mask)
    for (int i = (0); i < (n); ++i)
      if (dpgroup[mask][i] != 0) {
        for (int j = (0); j < (n); ++j)
          if ((mask & (1 << j)) == 0 && g[i][j] == 1)
            inc(dpgroup[mask ^ (1 << j)][j], dpgroup[mask][i]);
      }
  for (int i = (0); i <= (n); ++i)
    for (int mask = (0); mask < (1 << n); ++mask) subgroup[i][mask] = 0;
  inc(subgroup[0][0], 1);
  for (int mask = (0); mask < (1 << n); ++mask)
    for (int i = (0); i < (n); ++i)
      inc(subgroup[bitcount[mask]][mask], dpgroup[mask][i]);
  for (int i = (0); i <= (n); ++i)
    for (int bit = (0); bit < (n); ++bit)
      for (int mask = (0); mask < (1 << n); ++mask)
        if ((mask & (1 << bit)) != 0)
          inc(subgroup[i][mask], subgroup[i][mask ^ (1 << bit)]);
  for (int val = (0); val < (1 << (n - 1)); ++val) ans[val] = 0;
  for (int mask = (0); mask < (1 << n); ++mask)
    prod[0][mask] = subgroup[0][mask];
  ngroup = 0;
  rec(n);
  for (int bit = (0); bit < (n - 1); ++bit)
    for (int val = (0); val < (1 << (n - 1)); ++val)
      if ((val & (1 << bit)) == 0) dec(ans[val], ans[val ^ (1 << bit)]);
}
void run() {
  scanf("%d", &n);
  for (int i = (0); i < (n); ++i) scanf("%s", &s[i]);
  solve();
  for (int i = (0); i < (1 << (n - 1)); ++i) {
    if (i != 0) printf(" ");
    printf("%lld", ans[i]);
  }
  puts("");
}
void stress() {
  for (n = 2; n <= MAXN; ++n) {
    for (int i = (0); i < (n); ++i)
      for (int j = (0); j < (n); ++j) s[i][j] = i == j ? '0' : '1';
    for (int i = (0); i < (n); ++i) s[i][n] = '\0';
    solve();
    printf("done %d\n", n);
  }
}
int main() {
  run();
  return 0;
}
