如果一个整数,其各个数位不包含 0 , 1 , 2 0,1,2 0,1,2 以外的数字,则称这个数为三元数。
例如, 1022 , 11 , 21 , 2002 1022,11,21,2002 1022,11,21,2002 都是三元数。
给定一个可能很长的三元数 x x x,其首位数字(最左边那位)保证为 2 2 2,其他位数字为 0 0 0 或 1 1 1 或 2。
我们规定,两个长度为 n n n 的三元数 a a a 和 b b b 可以通过三元异或运算 ⊙ ⊙ ⊙ 得到另一个长度为 n n n 的三元数 c c c。
设 a i , b i , c i ai,bi,ci ai,bi,ci 分别表示 a , b , c a,b,c a,b,c 的第 i i i 位的数字,则 c i = ( a i + b i ) m o d 3 ci=(ai+bi)~mod~~3 ci=(ai+bi) mod 3。
例如, 10222 ⊙ 11021 = 21210 10222 ⊙ 11021=21210 10222⊙11021=21210。
你的任务是对于每个给定的 x x x,求出可以满足 a ⊙ b = x a ⊙ b=x a⊙b=x,并且 m a x ( a , b ) max(a,b) max(a,b) 尽可能小的 a , b a,b a,b。
注意, a , b a,b a,b 都必须是 n n n 位三元数,且不含前导 0 0 0。
输入格式
第一行包含整数
T
T
T,表示共有
T
T
T 组测试数据。
每组数据第一行包含整数 n n n,表示 x x x 的长度。
第二行包含一个长度为 n n n,首位为 2 2 2 的三元数 x x x。
输出格式
每组数据输出占两行,分别包含数
a
a
a 和数
b
b
b。
如果答案不唯一,则输出任意合理答案均可。
数据范围
1
≤
T
≤
1
0
4
,
1≤T≤10^4,
1≤T≤104,
1
≤
n
≤
5
×
1
0
4
,
1≤n≤5×10^4,
1≤n≤5×104,
同一测试点所有
n
n
n 的和不超过
5
×
1
0
4
5×10^4
5×104。
输入样例:
4
5
22222
5
21211
1
2
9
220222021
输出样例:
11111
11111
11000
10211
1
1
110111011
110111010
#include
#include
using namespace std;
const int N = 50010;
typedef long long LL;
int n;
char s[N], a[N], b[N];
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%s", &n, s);
char c1, c2;
bool flag = false;
for(int i = 0; i < n; i++){
if(s[i] == '0'){
c1 = c2 = '0';
}else if(s[i] == '1'){
if(flag) c1 = '1', c2 = '0';
else flag = true, c1 = '0', c2 = '1';
}else{
if(i == 0 || !flag) c1 = c2 = '1';
else c1 = '2', c2 = '0';
}
a[i] = c1, b[i] = c2;
}
a[n] = '\0', b[n] = '\0';
puts(a), puts(b);
}
return 0;
}