智乃想考一道构造题
题号:NC269402
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

给你两个长度大小为N01数组A,B(指数组元素的值都为0和1)接下来,智乃将按照如下的顺序执行某些过程。

1、如果B数组中所有元素的值全部为0则打印A数组的值并退出程序

2、定义两个新的01数组A',B'A'_{i}=A_{i}\& B_{i},B'_{i}=A_{i}\oplus B_{i}

3、向A'从数组最左侧插入一个0,向B'从数组最右侧插入一个0A'=[0,A'_{0},A'_{1},...,A'_{l}]B'=[B'_{0},B'_{1},...,B'_{l},0]l表示A'和B'数组在插入元素前的长度。

4、令A=B',B=A',并回到1过程。


其中\&表示位运算取与\oplus表示位运算异或

智乃原本通过数组A和数组B通过这一系列过程得到了打印出的结果。现在数组A,B分别有一些位置上的数字被使用?字符代替,但是保证不存在A,B数组对应下标相同的位置同时为?的情况,例如不会出现A=0?1,B=1?1这样的情况。

现在给你带有?字符的数组A,B以及经过这一过程打印出的结果C,请你告诉智乃,是否存在将?字符填充为01A,B能够使得它们经过运算后打印的结果为C,若存在请任意构造一对满足题目要求的A,B

输入描述:

第一行输入两个正整数N,M(1\leq N,M \leq 2\times 10^{6}),表示A,B数组的原始长度。

接下来一行输入一个长度大小为N的字符串A,其中A_{i}(A_{i}\in \{0,1,?\})表示数组A每个元素的值。

接下来一行输入一个长度大小为N的字符串B,其中B_{i}(B_{i}\in \{0,1,?\})表示数组B每个元素的值。

接下来一行输入一个长度大小为M01串表示该过程输出的结果。

输出描述:

如果存在这样的A,B,请首先输出一行一个字符串Yes

接下来两行分别输出两个01串表示A,B的初始值。

你可以输出任何一对满足题目要求的A,B

如果不存在这样的A,B,则只需要输出一个字符串No
示例1

输入

复制
3 7
11?
1?1
0001000

输出

复制
Yes
110
101

说明

假设A=[1,1,0],B=[1,0,1]
第一次操作后
0110
0100
第二次操作后
00100
00100
第三次操作后
000000
000100
第四次操作后
0001000
0000000
结束算法,并打印0001000
示例2

输入

复制
1 5
1
?
10101

输出

复制
No
示例3

输入

复制
5 10
?1???
0?000
1000010000

输出

复制
Yes
11111
01000