给你一个只包含字符 '0', '1', 和 '?' 的字符串 ss。你需要用 '0' 或 '1' 替换 ss 中的所有 '?' 从而使得 ss 变成一个回文串并且 正好有 aa 个 '0' 以及 正好有 bb 个 '1'. 注意每个字符 '?' 都是 独立于 其他字符被替换.
如果一个长度为 nn 的字符串 tt 对于所有的 i(1\le i\le n)i(1≤i≤n) 都满足 t[i]=t[n-i+1]t[i]=t[n−i+1] 那么 tt 被称为回文串
例如,如果 s=s="01?????0", a=4a=4 并且 b=4b=4, 那么你可以用以下方法替换 '?' :
- "01011010";
- "01100110".
对于给定的字符串 ss 以及整数 aa 和 bb, 用 '0' 或 '1' 替换 ss 中所有的 '?' 从而使的字符串 ss 回文 并且 正好有 aa 个 '0' 以及 正好有 bb 个 '1'.
Input
第一行一个整数 tt (1 \le t \le 10^41≤t≤104). 下面是 tt 个测试样例.
每个测试样例第一行有两个整数 aa 和 bb (0 \le a, b \le 2 \cdot 10^50≤a,b≤2⋅105, a + b \ge 1a+b≥1).
每个测试样例第二行是一个长度为 a+ba+b 的字符串 ss, 包含字符 '0', '1', 和 '?'.
保证所有测试样例字符串 ss 的长度和不超过 2 \cdot 10^52⋅105.
Output
对每个测试样例输出:
- "-1", 如果你无法对于给定的字符串 ss 以及整数 aa 和 bb, 用 '0' 或 '1' 替换 ss 中所有的 '?' 从而使的字符串 ss 回文 并且 正好有 aa 个 '0' 以及 正好有 bb 个 '1';
- 否则输出你替换所有的 '?' 且满足条件的字符串
如果有多个正确的构造方式,输出任意一个即可.
Example
Input
9 4 5 ?1???0110 1 1 ?? 0 1 ? 2 2 0101 2 2 01?0 0 1 0 3 0 0?0 2 2 1??1 2 5 ??010??
Output
011010110 -1 1 -1 0110 -1 000 1001 1101011
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int t,i,a,b;
scanf("%d",&t);
while(t--)
{ int a1=0,b1=0,c1=0,find=0,n;
char s[400005];
scanf("%d%d",&a,&b);getchar();
scanf("%s",s);
for(i=0;i<=a+b-1;i++)
{
if(s[i]=='1')b1++;
if(s[i]=='0')a1++;
if(s[i]=='?')c1++;
}
n=a+b;
for(i=0;i<=a+b-1;i++)//回文对称数相同
{
if(s[i]=='1'&&s[n-i-1]=='?')
s[n-i-1]='1',b1++;
if(s[i]=='0'&&s[n-i-1]=='?')
s[n-i-1]='0',a1++;
}
for(i=0;i<n;i++)
{
if(s[i]!=s[n-1-i])
{find=1;break;}
if(i==n-i-1&&s[i]=='?')//如果总数奇数中间一位为?
{
if(a1<=a-1)
s[i]='0',a1++;
else if(b1<=b-1)
s[i]='1',b1++;
}
if(s[i]=='?'&&s[n-i-1]=='?')//如果对称两项为?
{
if(a1<=a-2)
s[i]=s[n-i-1]='0',a1+=2;
else if(b1<=b-2)
s[i]=s[n-i-1]='1',b1+=2;
}
}
if(a1==a&&b1==b&&find==0) puts(s);
else printf("-1\n");
}
return 0;
}