#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
void program();
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  program();
}
const int MX = 19, BIT = 1 << MX;
int n, bit, sbit;
string s[MX];
bitset<MX> knows[MX];
long long dp[BIT][MX];
long long g[MX][BIT];
vector<int> v;
map<vector<int>, vector<int> > mp;
long long ans[BIT];
long long d[BIT];
long long savedD[BIT][MX];
void fillAns(int tot = 0, int last = 1) {
  if (tot == n) {
    long long add = 0;
    int x = bit - 1;
    for (int i = int(0); i < int(bit); i++) {
      if (__builtin_popcount(i) % 2)
        add -= d[i ^ x];
      else
        add += d[i ^ x];
    }
    vector<int>& f = mp[v];
    for (int i : f) ans[i] = add;
    return;
  }
  if (tot + last > n) return;
  for (int i = int(0); i < int(bit); i++) savedD[i][tot] = d[i];
  for (int i = int(last); i < int(n - tot + 1); i++) {
    if (tot + i != n && tot + i + i > n) continue;
    v.push_back(i);
    for (int j = int(0); j < int(bit); j++) d[j] *= g[i][j];
    fillAns(tot + i, i);
    for (int j = int(0); j < int(bit); j++) d[j] = savedD[j][tot];
    v.pop_back();
  }
}
void program() {
  cin >> n;
  for (int i = int(0); i < int(n); i++) cin >> s[i];
  for (int i = int(0); i < int(n); i++) knows[i].reset();
  for (int i = int(0); i < int(n); i++)
    for (int j = int(0); j < int(n); j++)
      if (s[i][j] == '1') knows[i][j] = 1;
  for (int i = int(0); i < int(BIT); i++)
    for (int j = int(0); j < int(MX); j++) dp[i][j] = 0;
  for (int i = int(0); i < int(n); i++) dp[1 << i][i] = 1;
  bit = (1 << n);
  sbit = (1 << (n - 1));
  for (int i = int(0); i < int(bit); i++)
    for (int j = int(0); j < int(n); j++) {
      for (int k = int(0); k < int(n); k++)
        if (!((i >> k) & 1))
          if (knows[j][k]) {
            dp[i | (1 << k)][k] += dp[i][j];
          }
    }
  for (int j = int(0); j < int(bit); j++) {
    int i = __builtin_popcount(j);
    for (int k = int(0); k < int(n); k++) g[i][j] += dp[j][k];
  }
  for (int i = int(0); i < int(n + 1); i++) {
    for (int j = int(0); j < int(n); j++)
      for (int mask = int(0); mask < int(bit); mask++)
        if ((mask >> j) & 1) g[i][mask] += g[i][mask ^ (1 << j)];
  }
  for (int i = int(0); i < int(sbit); i++) {
    int cnt = 1;
    v.clear();
    for (int j = int(0); j < int(n - 1); j++) {
      if ((i >> j) & 1) {
        cnt++;
      } else {
        v.push_back(cnt);
        cnt = 1;
      }
    }
    v.push_back(cnt);
    sort(v.begin(), v.end());
    mp[v].push_back(i);
    ans[i] = 0;
  }
  for (int i = int(0); i < int(bit); i++) d[i] = 1;
  v.clear();
  fillAns();
  for (int i = int(0); i < int(n - 1); i++)
    for (int mask = int(0); mask < int(sbit); mask++)
      if (!((mask >> i) & 1)) ans[mask] -= ans[mask | (1 << i)];
  for (int i = int(0); i < int(sbit); i++)
    cout << (i == 0 ? "" : " ") << ans[i];
  cout << endl;
}
