#include <bits/stdc++.h>
#define last last2
#define FR first
#define SE second

using namespace std;

typedef pair<int,int> pr;

int val[10000005],pre[10000005];
int head[2000005],tail[2000005];
int dis[2000005],leng[2000005];
int cnt,tot;

pr num[2000005];
int len;

int insert(int st,int k) {
  static pr cur[2000005];
  static int curhead[2000005],curtail[2000005];
  static int curleng[2000005],curdis[2000005];
  if (st==1||st==2) {
  	for(int i=len;i>0;i--) num[i+1]=num[i];
  	num[1]=pr(0,st);
  	len++;
  } 
  else if (st==3) {
  	for(int i=len;i>0;i--) num[i+1]=num[i];
  	num[1]=pr(0,st);
  	len++;
  	for(int i=cnt;i>0;i--) {
  		head[i+1]=head[i];
  		tail[i+1]=tail[i];
  		leng[i+1]=leng[i];
  		dis[i+1]=dis[i];
	  }
  	cnt++;
  	head[1]=tail[1]=++tot;
  	leng[1]=1;dis[1]=0;
  }
  st=0;
  int sz1=0,sz2=0,r=1;
  bool v=0;
  for(int i=1;i<=len;i++) {
    if (num[i].SE<=2) {
    	if (!st) st=num[i].SE;
    	else if (st==num[i].SE) {
		    cur[++sz1]=num[i];
		    st=0;
	    }
    	else {
    		cur[++sz1]=pr(num[i].FR+1,3);
    		sz2++;
    		curhead[sz2]=curtail[sz2]=++tot;
    		curleng[sz2]=1;curdis[sz2]=0;
    		st=0;
    		if (num[i].FR==k) v=1;
		}
	} 
	else {
		if (!st) {
			cur[++sz1]=pr(num[i].FR+1,3);
			sz2++;
			curhead[sz2]=head[r];
			curtail[sz2]=tail[r];
			curleng[sz2]=leng[r];
			curdis[sz2]=dis[r];
			if (num[i].FR+dis[r]==k) v=1;
		}
		else {
			if (leng[r]&1) st=3-st;
			int d=num[i].FR+dis[r],nst=st,last=sz1;
			for(int j=tail[r];j;j=pre[j]) {
				nst=3-nst;
				cur[++sz1]=pr(d,nst);
				d-=val[j];
			} 
			reverse(cur+last+1,cur+sz1+1);
		}
		r++;
	}
  }
  len=sz1;cnt=sz2;
  for(int i=1;i<=len;i++) num[i]=cur[i];
  for(int i=1;i<=cnt;i++) {
  	head[i]=curhead[i];
  	tail[i]=curtail[i];
  	leng[i]=curleng[i];
  	dis[i]=curdis[i];
  }
  return (!v)?st:3-st;
}

void merge(int k) {
  static pr cur[2000005];
  static int curhead[2000005],curtail[2000005];
  static int curleng[2000005],curdis[2000005];
  if (num[len].SE<3) {
  	if (num[len].FR>k) len--;
  }
  else {
  	if (num[len].FR+dis[cnt]>k) {
	  leng[cnt]--;dis[cnt]-=val[tail[cnt]];
	  tail[cnt]=pre[tail[cnt]];
    }
  	if (!leng[cnt]) {
  		len--;cnt--;
  	}
  }
  int sz1=0,sz2=0,r=1;
  for(int i=1;i<=len;i++)
    if (i==1||num[i].SE!=3||cur[sz1].SE!=3) {
    	cur[++sz1]=num[i];
    	if (num[i].SE==3) {
    		sz2++;
    		curhead[sz2]=head[r];
    		curtail[sz2]=tail[r];
    		curleng[sz2]=leng[r];
    		curdis[sz2]=dis[r];
    		r++;
		}
	}
	else {
		pre[head[r]]=curtail[sz2];
		val[head[r]]=num[i].FR-(cur[sz1].FR+curdis[sz2]);
		curtail[sz2]=tail[r];
		curleng[sz2]+=leng[r];
		curdis[sz2]+=dis[r]+val[head[r]];
		r++;
	}
  len=sz1;cnt=sz2;
  for(int i=1;i<=len;i++) num[i]=cur[i];
  for(int i=1;i<=cnt;i++) {
  	head[i]=curhead[i];
  	tail[i]=curtail[i];
  	leng[i]=curleng[i];
  	dis[i]=curdis[i];
  }
}

char s1[1000005],s2[1000005];
bool ans1[2000005],ans2[2000005];

int main() {
  int n,m,k;
  scanf("%d%d%d",&n,&m,&k);
  scanf("%s%s",s1+1,s2+1);
  reverse(s1+1,s1+n+1);
  reverse(s2+1,s2+m+1);
  for(int i=1;i<=max(n,m);i++) {
  	int st=0;
  	if (s1[i]=='1'&&s2[i]=='1') st=3;
  	else if (s1[i]=='1') st=1;
  	else if (s2[i]=='1') st=2;
  	st=insert(st,k);
  	ans1[i]=((st==1||st==3)?1:0);
  	ans2[i]=((st==2||st==3)?1:0);
  	merge(k);
  }
  int d1=max(n,m),d2=max(n,m);
  while (len) {
  	int st=insert(0,k);
  	ans1[++d1]=((st==1||st==3)?1:0);
  	ans2[++d2]=((st==2||st==3)?1:0);
  	merge(k);
  }
  while (!ans1[d1]) d1--;
  for(int i=d1;i>0;i--) putchar((ans1[i])?'1':'0');
  printf("\n");
  while (!ans2[d2]) d2--;
  for(int i=d2;i>0;i--) putchar((ans2[i])?'1':'0');
  printf("\n");
  return 0;
}

Measured memory_bytes: 55296