You are given a string s consisting of the characters ‘0’, ‘1’, and ‘?’. You need to replace all the characters with ‘?’ in the string s by ‘0’ or ‘1’ so that the string becomes a palindrome and has exactly a characters ‘0’ and exactly b characters ‘1’. Note that each of the characters ‘?’ is replaced independently from the others.
A string t of length n is called a palindrome if the equality t[i]=t[n−i+1] is true for all i (1≤i≤n).
For example, if s=“01???0”, a=4 and b=4, then you can replace the characters ‘?’ in the following ways:
“01011010”;
“01100110”.
For the given string s and the numbers a and b, replace all the characters with ‘?’ in the string s by ‘0’ or ‘1’ so that the string becomes a palindrome and has exactly a characters ‘0’ and exactly b characters ‘1’.
Input
The first line contains a single integer t (1≤t≤104). Then t test cases follow.
The first line of each test case contains two integers a and b (0≤a,b≤2⋅105, a+b≥1).
The second line of each test case contains the string s of length a+b, consisting of the characters ‘0’, ‘1’, and ‘?’.
It is guaranteed that the sum of the string lengths of s over all test cases does not exceed 2⋅105.
Output
For each test case, output:
“-1”, if you can’t replace all the characters ‘?’ in the string s by ‘0’ or ‘1’ so that the string becomes a palindrome and that it contains exactly a characters ‘0’ and exactly b characters ‘1’;
the string that is obtained as a result of the replacement, otherwise.
If there are several suitable ways to replace characters, you can output any.
Example
Input
9
4 4
01???0
3 3
???
1 0
?
2 2
0101
2 2
01?0
0 1
0
0 3
1?1
2 2
?00?
4 3
??010?0
Output
01011010
-1
0
-1
0110
-1
111
1001
0101010
题意:
给你a个0,b个1,一个字符串,将给的字符串中的?替换为0或1,使这个字符串为有a个0,b个1的回文串,如果可以,就输出回文串,不可以,输出-1
思路:
模拟+思维 =AC(还有n次的WA)
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[400010];
int pal(char a[],int l)
{
for(int i=0; i<l; i++)
{
if(a[i]!=a[l-1-i])
return 0;
}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d %d",&a,&b);
scanf("%s",s);
int l=strlen(s);
int num0=0,num1=0;
for(int i=0; i<l; i++)
{
if(s[i]=='0')
num0++;
else if(s[i]=='1')
num1++;
}
if(num0>a||num1>b)
printf("-1\n");
else
{
a=a-num0;
b=b-num1;
int f=0;
for(int i=0; i<=l/2; i++)
{
if(s[i]=='0')
{
if(s[l-1-i]=='?')
{
if(a>=1)
{
s[l-1-i]='0';
a--;
}
}
}
else if(s[i]=='1')
{
if(s[l-1-i]=='?')
{
if(b>=1)
{
s[l-1-i]='1';
b--;
}
}
}
else if(s[i]=='?')
{
if(s[l-1-i]=='0')
{
if(a>=1)
{
s[i]='0';
a--;
}
}
else if(s[l-1-i]=='1')
{
if(b>=1)
{
s[i]='1';
b--;
}
}
}
}
for(int i=0; i<=l/2; i++)
{
if(s[i]=='?')
{
if(s[l-1-i]=='?')
{
if(l-1-i==i)
{
if(a>=1)
{
s[i]='0';
a--;
}
else if(b>=1)
{
s[i]='1';
b--;
}
}
else if(a>=2)
{
s[i]='0';
s[l-1-i]='0';
a-=2;
}
else if(b>=2)
{
s[i]='1';
s[l-1-i]='1';
b-=2;
}
}
}
}
for(int i=0; i<l; i++)
{
if(s[i]=='?')
{
f=1;
break;
}
}
if(f==1||pal(s,l)==0||a||b)
printf("-1\n");
else
printf("%s\n",s);
}
}
return 0;
}