#include <bits/stdc++.h>
#pragma GCC optimize("-Ofast", "-funroll-all-loops", "-ffast-math")
using namespace std;
int N[20], n;
map<vector<int>, int> cf[20];
vector<int> v, rv[20][9999];
void dfs(int cs, int u, int ub) {
  cf[cs][v] = ++N[cs], rv[cs][N[cs]] = v;
  for (int d = u; d + cs <= ub; ++d)
    v.push_back(d), dfs(cs + d, d, ub), v.pop_back();
}
int go[20][390][20];
char g[20][20];
long long ch[19][1 << 18], tt[390];
long long f2[1 << 18][20], op[1 << 18];
long long ans[1 << 18], oo[390];
int main() {
  dfs(0, 1, 18);
  for (int i = 0; i <= 18; ++i)
    for (int j = 1; j <= N[i]; ++j)
      for (int k = 1; i + k <= 18; ++k) {
        vector<int> w = rv[i][j];
        w.push_back(k);
        sort(w.begin(), w.end());
        go[i][j][k] = cf[i + k][w];
        assert(go[i][j][k] != 0);
      }
  cin >> n;
  for (int i = 0; i < n; ++i) cin >> g[i];
  for (int i = 0; i < n; ++i) {
    memset(f2, 0, sizeof f2);
    f2[1 << i][i] = 1;
    for (int x = 0; x < (1 << n); ++x)
      for (int y = 0; y < n; ++y)
        if (f2[x][y]) {
          ch[__builtin_popcount(x)][x] += f2[x][y];
          for (int k = 0; k < n; ++k)
            if (!(x & (1 << k)) && g[y][k] == '1')
              f2[x | (1 << k)][k] += f2[x][y];
        }
  }
  for (int i = 0; i <= n; ++i)
    for (int k = 0; k < n; ++k)
      for (int j = 0; j < (1 << n); ++j)
        if (j & (1 << k)) ch[i][j] += ch[i][j ^ (1 << k)];
  for (int a = 1; a <= N[n]; ++a) {
    vector<int>& v = rv[n][a];
    for (int k = 0; k < (1 << n); ++k) op[k] = 1;
    for (int j = 0; j < v.size(); ++j) {
      long long* cv = ch[v[j]];
      for (int k = 0; k < (1 << n); ++k) op[k] = op[k] * cv[k];
    }
    long long tt = 0;
    for (int k = 0; k < (1 << n); ++k)
      if ((__builtin_popcount(k) - n) & 1)
        tt -= op[k];
      else
        tt += op[k];
    oo[a] = tt;
  }
  for (int j = 0; j < (1 << (n - 1)); ++j) {
    static int p[30], cn[30];
    memset(cn, 0, sizeof cn);
    for (int i = 0; i < n; ++i) p[i] = (j >> i) & 1;
    int x = 0, y = 1, g = 0;
    long long F = 1;
    for (int i = 0; i < n; ++i) {
      if (p[i])
        ++g;
      else {
        if (g) {
          ++g;
          y = go[x][y][g];
          x += g;
        }
        g = 0;
      }
    }
    while (x < n) y = go[x][y][1], ++x;
    F *= oo[y];
    ans[j] = F;
  }
  for (int k = 0; k < n - 1; ++k)
    for (int j = 0; j < (1 << (n - 1)); ++j)
      if (j & (1 << k)) ans[j ^ (1 << k)] = ans[j ^ (1 << k)] - ans[j];
  for (int j = 0; j < (1 << (n - 1)); ++j) printf("%lld ", ans[j]);
}
