Palindrome CodeForces - 1512C

本文介绍了一种解决给定0、1数量限制下,将字符串中的问号替换为0或1以形成回文串的算法。题目要求字符串长度、0和1的数量固定,并且替换后必须保持回文特性。提供的C++代码实现了该问题的解决方案,通过检查字符串和调整0、1的剩余数量来判断是否可行并构造回文串。若无法满足条件,则输出-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值