#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k, lst, a[22], b[1 << 18], o[1 << 18];
long long f[1 << 18][18], g[1 << 18];
char s[22][22];
void rec(int sum, int x, int mask) {
  if (sum == 0) {
    for (i = 0; i < (1 << n); i++)
      if (b[i] > lst)
        for (j = 0; j < n; j++) f[i][j] = 0;
    for (i = 0; i < (1 << n) - 1; i++)
      if (b[i] >= lst)
        for (j = 0; j < n; j++)
          if (f[i][j]) {
            int prv = (1 << n) - 1 - i;
            if ((mask >> (n - b[i] - 1)) & 1) {
              for (int x = (prv & (prv - 1)); prv > 0; x &= (x - 1)) {
                k = o[prv ^ x];
                if (s[j][k] == '1') f[i ^ (1 << k)][k] += f[i][j];
                prv = x;
              }
            } else
              for (int x = (prv & (prv - 1)); prv > 0; x &= (x - 1)) {
                k = o[prv ^ x];
                f[i ^ (1 << k)][k] += f[i][j];
                prv = x;
              }
          }
    for (j = 0; j < n; j++) g[mask] += f[i][j];
    return;
  }
  for (; x > 0; x--) {
    rec(sum - x, min(sum - x, x), (mask << x) + (1 << (x - 1)) - 1);
    lst = n - (sum - x + 1);
  }
}
int main() {
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%s", s[i]);
    f[1 << i][i] = 1;
    o[1 << i] = i;
  }
  lst = 1;
  for (i = 0; i < (1 << n); i++) b[i] = b[i / 2] + (i & 1);
  rec(n, n, 0);
  for (i = 0; i < (1 << (n - 1)); i++) {
    for (m = 0, j = -1; j < n - 1; j = k) {
      for (k = j + 1; k < n - 1 && ((i >> k) & 1); k++)
        ;
      a[m++] = k - j;
    }
    sort(a, a + m);
    reverse(a, a + m);
    for (k = j = 0; j < m; j++) k = (k << a[j]) + (1 << (a[j] - 1)) - 1;
    g[i] = g[k];
  }
  for (j = n - 1; j >= 0; j--)
    for (i = (1 << (n - 1)) - 1; i > 0; i--)
      if ((i >> j) & 1) g[i ^ (1 << j)] -= g[i];
  for (i = 0; i < (1 << (n - 1)); i++) printf("%I64d ", g[i]);
  return 0;
}
