#define PROBLEM "https://judge.yosupo.jp/problem/matrix_product_mod_2"
#include"template.hpp"
#include"data-structure/bitset.hpp"intmain(){cin.tie(nullptr)->sync_with_stdio(false);intn,m,k;cin>>n>>m>>k;vector<BitSet>a(n,BitSet(m)),b(m,BitSet(k));for(inti=0;i<n;i++){strings;cin>>s;for(intj=0;j<m;j++)if(s[j]=='1')a[i].set(j);}for(inti=0;i<m;i++){strings;cin>>s;for(intj=0;j<k;j++)if(s[j]=='1')b[i].set(j);}for(inti=0;i<n;i++){BitSetc(k);for(intj=a[i].find_first();j<m;j=a[i].find_next(j+1))c^=b[j];strings(k,'0');for(intj=0;j<k;j++)if(c[j])s[j]='1';cout<<s<<"\n";}}
#line 1 "verify/yosupo/data-structure/bitset/matrix_product_mod_2.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/matrix_product_mod_2"
#line 2 "template.hpp"
#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingdb=longdouble;usingi128=__int128_t;usingu32=uint32_t;usingu64=uint64_t;template<classT>usingPQ=priority_queue<T,vector<T>,greater<T>>;constintINF=INT_MAX/2;constllLINF=LLONG_MAX/4;constdbDINF=numeric_limits<db>::infinity();constdbEPS=1e-9;constdbPI=acos(db(-1));#define ALL(a) a.begin(),a.end()
#define RALL(a) a.rbegin(),a.rend()
#define SZ(a) (int)(a.size())
#define SORT(a) sort(ALL(a))
#define RSORT(a) sort(RALL(a))
#define REV(a) reverse(ALL(a))
#define UNI(a) a.erase(unique(ALL(a)),a.end())
#define LB(a,x) (int)(lower_bound(ALL(a),x)-a.begin())
#define UB(a,x) (int)(upper_bound(ALL(a),x)-a.begin())
#define FIND(a,x) (int)(find(ALL(a),x)-a.begin())
#define COUNT(a,x) (int)count(ALL(a),x)
#define MIN(a) *min_element(ALL(a))
#define MAX(a) *max_element(ALL(a))
template<classT,classU>boolchmin(T&a,Ub){returnb<a?a=b,1:0;}template<classT,classU>boolchmax(T&a,Ub){returna<b?a=b,1:0;}template<classT>Tfloor(Ta,Tb){returna/b-((a^b)<0&&a%b);}template<classT>Tceil(Ta,Tb){returna/b+((a^b)>=0&&a%b);}intpopcnt(llx){return__builtin_popcountll(x);}inttopbit(llx){returnx==0?-1:63-__builtin_clzll(x);}intlowbit(llx){returnx==0?-1:__builtin_ctzll(x);}template<classT,classU>TSUM(constU&a){returnaccumulate(ALL(a),T{});}template<classT>vector<int>argsort(constvector<T>&a){vector<int>p(SZ(a));iota(ALL(p),0);stable_sort(ALL(p),[&](inti,intj){returna[i]<a[j];});returnp;}template<classT,size_tD=0>structVecBuilder{array<size_t,D>d;VecBuilder<T,D+1>operator[](size_tn)const{VecBuilder<T,D+1>res{};for(size_ti=0;i<D;i++)res.d[i]=d[i];res.d[D]=n;returnres;}template<size_tI=0>autobuild(constT&x)const{ifconstexpr(I+1==D)returnvector<T>(d[I],x);elsereturnvector<decltype(build<I+1>(x))>(d[I],build<I+1>(x));}autooperator()(constT&x=T())const{static_assert(D>0);returnbuild(x);}};template<classT>inlineconstexprVecBuilder<T>VEC{};mt19937rng(chrono::steady_clock::now().time_since_epoch().count());mt19937_64rng64(chrono::steady_clock::now().time_since_epoch().count());#line 2 "data-structure/bitset.hpp"
structBitSet{usingu64=uint64_t;vector<u64>dat;intn;staticu64maskbit(intp){return1ULL<<p;}structProxy{u64&dat;intidx;Proxy(vector<u64>&d,inti):dat(d[i>>6]),idx(i&63){}operatorbool()const{return(dat>>idx)&1;}booloperator~()const{return((dat>>idx)&1)^1;}Proxy&flip(){dat^=maskbit(idx);return*this;}Proxy&operator=(boolx){if(x)dat|=maskbit(idx);elsedat&=~maskbit(idx);return*this;}Proxy&operator=(constProxy&o){return*this=bool(o);}Proxy&operator|=(boolx){if(x)dat|=maskbit(idx);return*this;}Proxy&operator&=(boolx){if(!x)dat&=~maskbit(idx);return*this;}Proxy&operator^=(boolx){if(x)dat^=maskbit(idx);return*this;}};explicitBitSet(int_n=0,boolx=false):dat((_n+63)>>6,u64(x?-1:0)),n(_n){trim();}intsize()const{returnn;}voidtrim(){if(n&63)dat.back()&=maskbit(n&63)-1;}voidresize(intm,boolx=false){assert(m>=0);if(x&&n<m&&(n&63))dat[n>>6]|=u64(-1)<<(n&63);dat.resize((m+63)>>6,u64(x?-1:0));n=m;trim();}voidpush_back(boolx){if((n&63)==0)dat.push_back(0);if(x)dat[n>>6]|=maskbit(n&63);n++;}voidpop_back(){assert(n>0);n--;if((n&63)==0)dat.pop_back();elsedat.back()&=maskbit(n&63)-1;}Proxyoperator[](inti){assert(0<=i&&i<n);returnProxy(dat,i);}booloperator[](inti)const{assert(0<=i&&i<n);return(dat[i>>6]>>(i&63))&1;}voidset(){fill(ALL(dat),u64(-1));trim();}voidreset(){fill(ALL(dat),0);}voidflip(){for(auto&x:dat)x=~x;trim();}voidset(inti){(*this)[i]=1;}voidreset(inti){(*this)[i]=0;}voidflip(inti){(*this)[i].flip();}intcount()const{intres=0;for(autox:dat)res+=__builtin_popcountll(x);returnres;}boolany()const{for(autox:dat)if(x)returntrue;returnfalse;}boolnone()const{return!any();}boolall()const{returncount()==n;}BitSet&operator&=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]&=o.dat[i];return*this;}BitSet&operator|=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]|=o.dat[i];return*this;}BitSet&operator^=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]^=o.dat[i];return*this;}BitSet&operator<<=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=m-1;i>=q;i--)dat[i]=dat[i-q];}else{for(inti=m-1;i>q;i--)dat[i]=(dat[i-q]<<r)|(dat[i-q-1]>>(64-r));dat[q]=dat[0]<<r;}fill(dat.begin(),dat.begin()+q,0);trim();return*this;}BitSet&operator>>=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=0;i+q<m;i++)dat[i]=dat[i+q];}else{for(inti=0;i+q+1<m;i++)dat[i]=(dat[i+q]>>r)|(dat[i+q+1]<<(64-r));dat[m-q-1]=dat[m-1]>>r;}fill(dat.end()-q,dat.end(),0);return*this;}BitSetoperator&(constBitSet&o)const{returnBitSet(*this)&=o;}BitSetoperator|(constBitSet&o)const{returnBitSet(*this)|=o;}BitSetoperator^(constBitSet&o)const{returnBitSet(*this)^=o;}BitSetoperator<<(intk)const{returnBitSet(*this)<<=k;}BitSetoperator>>(intk)const{returnBitSet(*this)>>=k;}booloperator==(constBitSet&o){returnn==o.n&&dat==o.dat;}booloperator!=(constBitSet&o){return!(*this==o);}BitSetoperator~()const{BitSeto(*this);o.flip();returno;}intfind_next(inti)const{// first set bit >= i, n if noneif(i<0)i=0;if(i>=n)returnn;intq=i>>6;u64x=dat[q]&(u64(-1)<<(i&63));while(!x){if(++q==SZ(dat))returnn;x=dat[q];}returnq<<6|__builtin_ctzll(x);}intfind_prev(inti)const{// last set bit <= i, -1 if noneif(i>=n)i=n-1;if(i<0)return-1;intq=i>>6;u64x=dat[q]&(u64(-1)>>(63-(i&63)));while(!x){if(--q<0)return-1;x=dat[q];}returnq<<6|(63-__builtin_clzll(x));}intfind_first()const{returnfind_next(0);}intfind_last()const{returnfind_prev(n-1);}voidset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]|=ml&mr);if(l&63)dat[ql++]|=ml;if(r&63)dat[qr]|=mr;for(inti=ql;i<qr;i++)dat[i]=u64(-1);}voidreset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]&=~(ml&mr));if(l&63)dat[ql++]&=~ml;if(r&63)dat[qr]&=~mr;for(inti=ql;i<qr;i++)dat[i]=u64(0);}voidflip_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]^=ml&mr);if(l&63)dat[ql++]^=ml;if(r&63)dat[qr]^=mr;for(inti=ql;i<qr;i++)dat[i]=~dat[i];}intcount_range(intl,intr)const{assert(0<=l&&l<=r&&r<=n);if(l==r)return0;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)return__builtin_popcountll(dat[ql]&ml&mr);intres=0;if(l&63)res+=__builtin_popcountll(dat[ql++]&ml);if(r&63)res+=__builtin_popcountll(dat[qr]&mr);for(inti=ql;i<qr;i++)res+=__builtin_popcountll(dat[i]);returnres;}};#line 4 "verify/yosupo/data-structure/bitset/matrix_product_mod_2.test.cpp"
intmain(){cin.tie(nullptr)->sync_with_stdio(false);intn,m,k;cin>>n>>m>>k;vector<BitSet>a(n,BitSet(m)),b(m,BitSet(k));for(inti=0;i<n;i++){strings;cin>>s;for(intj=0;j<m;j++)if(s[j]=='1')a[i].set(j);}for(inti=0;i<m;i++){strings;cin>>s;for(intj=0;j<k;j++)if(s[j]=='1')b[i].set(j);}for(inti=0;i<n;i++){BitSetc(k);for(intj=a[i].find_first();j<m;j=a[i].find_next(j+1))c^=b[j];strings(k,'0');for(intj=0;j<k;j++)if(c[j])s[j]='1';cout<<s<<"\n";}}