A. Balance the Bits--Codeforces Round #712 (Div. 1)

Problem - 1503A - Codeforces

A. Balance the Bits

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

A sequence of brackets is called balanced if one can turn it into a valid math expression by adding characters '+' and '1'. For example, sequences '(())()', '()', and '(()(()))' are balanced, while ')(', '(()', and '(()))(' are not.

You are given a binary string ss of length nn. Construct two balanced bracket sequences aa and bb of length nn such that for all 1≤i≤n1≤i≤n:

  • if si=1si=1, then ai=biai=bi
  • if si=0si=0, then ai≠biai≠bi

If it is impossible, you should report about it.

Input

The first line contains a single integer tt (1≤t≤1041≤t≤104) — the number of test cases.

The first line of each test case contains a single integer nn (2≤n≤2⋅1052≤n≤2⋅105, nn is even).

The next line contains a string ss of length nn, consisting of characters 0 and 1.

The sum of nn across all test cases does not exceed 2⋅1052⋅105.

Output

If such two balanced bracked sequences exist, output "YES" on the first line, otherwise output "NO". You can print each letter in any case (upper or lower).

If the answer is "YES", output the balanced bracket sequences aa and bb satisfying the conditions on the next two lines.

If there are multiple solutions, you may print any.

Example

input

Copy

3
6
101101
10
1001101101
4
1100

output

Copy

YES
()()()
((()))
YES
()()((()))
(())()()()
NO

Note

In the first test case, a=a="()()()" and b=b="((()))". The characters are equal in positions 11, 33, 44, and 66, which are the exact same positions where si=1si=1.

In the second test case, a=a="()()((()))" and b=b="(())()()()". The characters are equal in positions 11, 44, 55, 77, 88, 1010, which are the exact same positions where si=1si=1.

In the third test case, there is no solution.

==================================================================================================================================================

C题很多套路是,1特殊到一般,2排除不可能情况之后的构造。

本题是第二种

首先0就代表了上下必须要有一个位置是右括号),显然出现在开头可以直接跳过,同理结尾也是如此

然后考虑奇偶性,1的话上下一样,而我们左括号必须是总长度一半,如果1是奇数,那么0必定是奇数

这样总长度才是偶数,而1是奇数时,左右括号一定是一偶一奇,同理0里面也是1偶一奇

假设 1里面左偶右奇  那么上下1都必定是左偶右奇,而0里面的一奇一偶,只可能满足一方的,反转之后就无法满足令一方。故1必定是偶数。

然后我们考虑构造,数据范围可以看出构造一定是线性的。这个只能靠感性猜测,我们猜先填1会比较方便,一半左一半右

1      1                 1          1

(   (               )             )

然后我们猜测0的位置

1     0  1   0      1       1

(    (  (     )      )   )

1     0   1        1    0   1

( (   )    (  )   )

可以看出0其实是连续翻转着填的

总之此类题目不要想太多深奥结论,就从最简单的特殊情况,奇偶性,考虑简单线性递推即可。结果总会意外巧合。

# include<iostream>
using namespace std;
char ans[200000+10];

int main ()
{



    int t;

    cin>>t;

    while(t--)
    {


    int len;

    cin>>len;


        string s;

        cin>>s;

        if(s[0]=='0'||s[s.length()-1]=='0')
        {
            cout<<"NO"<<endl;

            continue;

        }

        int cnt0=0,cnt1=0;

        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='0')
                cnt0++;
            else
                cnt1++;

        }


        if(cnt0%2)
        {
            cout<<"NO"<<endl;

            continue;

        }

        int cnt00=0,cnt11=0;

        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='1')
            {
                cnt11++;

                if(cnt11<=cnt1/2)
                {
                    ans[i]='(';
                }
                else
                {
                    ans[i]=')';
                }
            }
            else
            {
                cnt00++;

                if(cnt00&1)
                {
                    ans[i]='(';

                }
                else
                {
                    ans[i]=')';

                }
            }
        }

        cout<<"YES"<<endl;

        for(int i=0;i<s.length();i++)
        {
            cout<<ans[i];
        }

        cout<<endl;

        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='0')
            {
                if(ans[i]=='(')
                {
                    cout<<')';
                }
                else
                {
                    cout<<'(';
                }
            }
            else
            {
                cout<<ans[i];
            }
        }

        cout<<endl;



    }
    return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qinsanma and Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值