#include <bits/stdc++.h>
using namespace std;
const int maxn = 18 + 2;
const int SZ = (1 << 18) + 5;
int n;
bool g[maxn][maxn];
char s[maxn];
long long dp[SZ][maxn], f[maxn][SZ];
int bit[SZ], bc[SZ];
inline int lowbit(int k) { return k & -k; }
inline void calc_f() {
  for (int i = 1; i <= n; i++) dp[(1 << (i - 1))][i] = 1;
  for (int i = 1; i < (1 << n); i++) {
    for (int j = i; j; j ^= lowbit(j)) {
      int u = bit[lowbit(j)];
      for (int v = 1; v <= n; v++) {
        if (!g[u][v]) continue;
        dp[i][u] += dp[i ^ lowbit(j)][v];
      }
    }
  }
  for (int i = 0; i < (1 << n); i++) {
    long long tmp = 0;
    int _bc = 0;
    for (int j = i; j; j ^= lowbit(j)) {
      _bc++;
      int u = bit[lowbit(j)];
      tmp += dp[i][u];
    }
    bc[i] = _bc;
    f[bc[i]][i] = tmp;
  }
  for (int id = 1; id <= n; id++) {
    for (int i = 2; i <= (1 << n); i <<= 1) {
      for (int j = 0; j < (1 << n); j += i) {
        for (int k = 0; k < (i >> 1); k++) {
          f[id][j + k + (i >> 1)] += f[id][j + k];
        }
      }
    }
  }
}
map<vector<int>, int> mp;
int HFS;
vector<int> lis[2010];
inline void calc_hf() {
  for (int i = 0; i < (1 << (n - 1)); i++) {
    vector<int> tmp;
    vector<int>().swap(tmp);
    int num = 1;
    for (int j = 1; j < n; j++) {
      if (!(i & (1 << (j - 1)))) {
        tmp.push_back(num);
        num = 1;
      } else
        num++;
    }
    if (num) tmp.push_back(num);
    sort(tmp.begin(), tmp.end());
    int id;
    if (mp.count(tmp))
      id = mp[tmp];
    else
      id = mp[tmp] = ++HFS;
    lis[id].push_back(i);
  }
}
long long Ans[SZ];
int N;
void dfs(int n, int k, const vector<int> &t1, const vector<long long> &t2) {
  if (!n) {
    long long now = 0;
    int all = (1 << N) - 1;
    for (int i = 0; i < (1 << N); i++) {
      if (bc[all ^ i] & 1)
        now -= t2[i];
      else
        now += t2[i];
    }
    int id = mp[t1];
    for (int i = 0, Sz = lis[id].size(); i < Sz; i++) {
      int u = lis[id][i];
      Ans[u] = now;
    }
    return;
  }
  for (int i = k; i <= n; i++) {
    vector<int> n1(t1);
    vector<long long> n2(t2);
    n1.push_back(i);
    for (int j = 0; j < (1 << N); j++) n2[j] = t2[j] * f[i][j];
    dfs(n - i, i, n1, n2);
  }
}
int main() {
  scanf("%d", &n);
  HFS = 0;
  N = n;
  for (int i = 1; i <= n; i++) bit[(1 << (i - 1))] = i;
  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    for (int j = 1; j <= n; j++) g[i][j] = s[j] - '0';
  }
  calc_f();
  calc_hf();
  vector<int> t1;
  vector<long long> t2;
  vector<int>().swap(t1);
  t2.resize(1 << n);
  for (int i = 0; i < (1 << n); i++) t2[i] = 1;
  dfs(n, 1, t1, t2);
  for (int i = 2; i <= (1 << (n - 1)); i <<= 1) {
    for (int j = 0; j < (1 << (n - 1)); j += i) {
      for (int k = 0; k < (i >> 1); k++) {
        Ans[j + k] -= Ans[j + k + (i >> 1)];
      }
    }
  }
  for (int i = 0; i < (1 << (n - 1)); i++) printf("%lld ", Ans[i]);
  puts("");
  return 0;
}
