#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2,ssse3,sse4,mmx,popcnt")
#include <bits/stdc++.h>
#define ar array

using namespace std;
using ll = long long;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int mxN = 2e5, mxM = 60;
int n, m, p;
vector<int> a[mxN];
using S = bitset<mxN>;
S a_inv[mxM];

ll ans = 0;

void solve(int start) {
  int k = (int)a[start].size();

  int best = 0;
  int best_cnt = __builtin_popcountll(ans);

  for (int s = 1; s < 1<<k; ++s) {
    if (__builtin_popcount(s) <= best_cnt) continue;
    S agree; agree.set();
    for (int kk = 0; kk < k; ++kk) {
      if (!(s & (1<<kk))) continue;
      agree &= a_inv[a[start][kk]];
    }
    if ((int)agree.count()*2 >= n) best = s, best_cnt = __builtin_popcount(s);
  }

  if (best_cnt > __builtin_popcountll(ans)) {
    ans = 0;
    for (int kk = 0; kk < k; ++kk) {
      if (!(best & (1<<kk))) continue;
      ans |= (1LL<<a[start][kk]);
    }
  }
}

int main() {
  cin.tie(0)->sync_with_stdio(0);

  // since 50% need to agree, any random guy has at least 50% chance of being in the set
  // need to only select a few people

  cin >> n >> m >> p;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      char c; cin >> c;
      if (c == '1') a[i].push_back(j);
    }
  }

  for (int i = 0; i < n; ++i)
    for (int j : a[i])
      a_inv[j].set(i);

  uniform_int_distribution<int> random_i(0, n-1);

  for (int rep = 0; rep < 10; ++rep) {
    int i = random_i(rng);
    solve(i);
  }

  for (int i = 0; i < m; ++i) {
    cout << (ans&1);
    ans /= 2;
  }
  cout << '\n';
}
