#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 18) + 2;
int n, e[20];
long long dp[N][20], f[N], g[20][N], d[N], cur[20][N];
map<vector<int>, vector<int> > mp;
vector<int> a;
char s[20];
void init() {
  cin >> n;
  for (int i = 0; i <= n - 1; i++) {
    scanf("%s", s);
    for (int j = 0; j <= n - 1; j++)
      if (s[j] == '1') e[i] |= (1 << j);
  }
}
void prework() {
  for (int i = 0; i <= n - 1; i++) dp[1 << i][i] = 1;
  for (int s = 0; s <= (1 << n) - 1; s++) {
    for (int i = 0; i <= n - 1; i++) {
      if (!dp[s][i]) continue;
      g[__builtin_popcount(s)][s] += dp[s][i];
      for (int j = 0; j <= n - 1; j++)
        if (((e[i] >> j) & 1) && !((s >> j) & 1))
          dp[s | (1 << j)][j] += dp[s][i];
    }
  }
  for (int len = 1; len <= n; len++) {
    for (int i = 0; i <= n - 1; i++) {
      for (int s = 0; s <= (1 << n) - 1; s++) {
        if ((s >> i) & 1) g[len][s] += g[len][s ^ (1 << i)];
      }
    }
  }
  for (int s = 0; s <= (1 << (n - 1)) - 1; s++) {
    int x = 0, len = 0;
    vector<int> t;
    t.clear();
    for (; x < n; x++) {
      int len = 1;
      while ((s >> x) & 1) ++x, ++len;
      t.push_back(len);
    }
    sort(t.begin(), t.end());
    mp[t].push_back(s);
  }
  for (int s = 0; s <= (1 << n) - 1; s++) d[s] = 1;
}
void dfs(int sum, int lst) {
  if (sum == n) {
    long long res = 0;
    int x = (1 << n) - 1;
    for (int s = 0; s <= (1 << n) - 1; s++) {
      if (__builtin_popcount(s) % 2)
        res -= d[x ^ s];
      else
        res += d[x ^ s];
    }
    for (int i = 0; i < mp[a].size(); i++) {
      f[mp[a][i]] += res;
    }
    return;
  }
  for (int s = 0; s <= (1 << n) - 1; s++) cur[sum][s] = d[s];
  for (int i = lst; i <= n - sum; i++) {
    if (sum + i != n && sum + 2 * i > n) continue;
    a.push_back(i);
    for (int s = 0; s <= (1 << n) - 1; s++) d[s] = cur[sum][s] * g[i][s];
    dfs(sum + i, i);
    a.pop_back();
  }
}
void solve() {
  dfs(0, 1);
  for (int i = 0; i <= n - 2; i++)
    for (int s = 0; s <= (1 << (n - 1)) - 1; s++)
      if (!((s >> i) & 1)) f[s] -= f[s ^ (1 << i)];
  for (int s = 0; s <= (1 << (n - 1)) - 1; s++) printf("%lld ", f[s]);
  puts("");
}
int main() {
  init();
  prework();
  solve();
  return 0;
}
