#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
using namespace std;
int n, nn;
char e[33][33];
unsigned long long g[301000][22], f[22][301000];
int siz[301000];
inline void FWT(unsigned long long *a) {
  for (int i = 1; i < nn; i <<= 1)
    for (int j = 0; j < nn; j += (i << 1))
      for (int k = 0; k < i; ++k) a[i + j + k] += a[j + k];
}
map<vector<int>, unsigned long long> mp;
vector<int> myvec;
unsigned long long h[22][301000];
void dfs(int cur, int lstv, int nwsum) {
  if (nwsum == n) {
    unsigned long long res = 0;
    for (int s = 0; s < nn; ++s)
      if ((n - siz[s]) & 1)
        res -= h[cur][s];
      else
        res += h[cur][s];
    mp[myvec] = res;
    return;
  }
  for (int s = 0; s < nn; ++s) h[cur + 1][s] = h[cur][s] * f[n - nwsum][s];
  myvec.push_back(n - nwsum);
  dfs(cur + 1, n - nwsum, n);
  myvec.pop_back();
  for (int i = lstv; nwsum + i + i <= n; ++i) {
    for (int s = 0; s < nn; ++s) h[cur + 1][s] = h[cur][s] * f[i][s];
    myvec.push_back(i);
    dfs(cur + 1, i, nwsum + i);
    myvec.pop_back();
  }
}
unsigned long long ans[301000];
inline void calc(int s) {
  vector<int> vec;
  int st = 0;
  for (int i = 1; i < n; ++i) {
    if (!((s >> (i - 1)) & 1)) {
      vec.push_back(i - st);
      st = i;
    }
  }
  vec.push_back(n - st);
  sort(vec.begin(), vec.end());
  ans[s] = mp[vec];
}
int main() {
  read(n);
  for (int i = 0; i < n; ++i) {
    scanf("%s", e[i]);
  }
  nn = 1 << n;
  for (int i = 0; i < n; ++i) g[1 << i][i] = 1;
  for (int s = 1; s < nn; ++s) {
    for (int i = 0; i < n; ++i)
      if (g[s][i]) {
        for (int j = 0; j < n; ++j)
          if (e[i][j] == '1' && !((s >> j) & 1)) {
            g[s ^ (1 << j)][j] += g[s][i];
          }
      }
  }
  for (int s = 1; s < nn; ++s) {
    siz[s] = siz[s >> 1] + (s & 1);
    for (int i = 0; i < n; ++i) {
      f[siz[s]][s] += g[s][i];
    }
  }
  for (int i = 0; i <= n; ++i) FWT(f[i]);
  for (int s = 0; s < nn; ++s) h[1][s] = 1;
  dfs(1, 1, 0);
  int nnn = nn >> 1;
  for (int s = 0; s < nnn; ++s) calc(s);
  for (int i = 1; i < nnn; i <<= 1)
    for (int j = 0; j < nnn; j += (i << 1))
      for (int k = 0; k < i; ++k) ans[j + k] -= ans[i + j + k];
  for (int i = 0; i < nnn; ++i) printf("%llu ", ans[i]);
  puts("");
  return 0;
}
