Codeforces Round #712 (Div. 1) A. Balance the Bits
admin
2024-01-21 23:00:52
0

原题链接:

Problem - 1503A - Codeforces

题目描述:

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.

题目大意:

给定一个二进制字符串s,要求根据字符串s构造两个合法的括号序列a和b。

规则为:当s[i]=’0‘时,a[i]必须等于b[i],当s[i]='1’时,a[i]必须不等于b[i]。

解题思路:

能放左括号就尽量放左括号。我们记左括号为+1,右括号为-1,那么合法的括号序列,整个的和一定为0。

设sum1记录括号序列a,sum2记录括号序列b,从左往右遍历,对于所有的s[i]=1,我们就先假定a[i]=b[i]='('。sum1和sum2都加1.

遇到s[i]=0,若当前sum1>sum2,则给a加右括号,sum1减1,给b加左括号,sum2加1。否则反之。

遍历完毕之后如果sum1和sum2不等于0,则需要调整。我们可以意识到我们只能对s[i]=1的位进行调整。

所以如果此时的sum1不等于sum2,或者sum1和sum2为奇数,则无解。

调整的方式是从右往左遍历,遇到s[i]=1则把a[i]和b[i]都调整为右括号,直到sum1和sum2为0。

代码(CPP):

#include 
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e5 + 10;
const int INF = 0x3fffffff;
int n, a[maxn], b[maxn];
string s;/*能放左括号就尽量放左括号。我们记左括号为+1,右括号为-1,那么合法的括号序列,整个的和一定为0。设sum1记录括号序列a,sum2记录括号序列b,从左往右遍历,对于所有的s[i]=1,我们就先假定a[i]=b[i]='('。sum1和sum2都加1.遇到s[i]=0,若当前sum1>sum2,则给a加右括号,sum1减1,给b加左括号,sum2加1。否则反之。遍历完毕之后如果sum1和sum2不等于0,则需要调整。我们可以意识到我们只能对s[i]=1的位进行调整。所以如果此时的sum1不等于sum2,或者sum1和sum2为奇数,则无解。调整的方式是从右往左遍历,遇到s[i]=1则把a[i]和b[i]都调整为右括号,直到sum1和sum2为0。
*/bool check()
{int L1 = 0, R1 = 0, L2 = 0, R2 = 0;for (int i = n; i >= 1; i--){if(a[i] == 1)L1++;if(a[i] == 0)R1++;if(b[i] == 1)L2++;if (b[i] == 0)R2++;if(L1 > R1 || L2 > R2)return false;}return true;
}void print()
{for (int i = 1; i <= n; i++){if(a[i] == 1)cout << "(";elsecout << ")";}cout << endl;for (int i = 1; i <= n; i++){if(b[i] == 1)cout << "(";elsecout << ")";}cout << endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout << fixed;cout.precision(18);int t;cin >> t;while(t--){cin >> n;cin >> s;s = " " + s;if(s[1] == '0'){cout << "NO\n";continue;}int sum1 = 0, sum2 = 0;for (int i = 1; i <= n; i++){if(s[i] == '1')sum1++, sum2++, a[i] = 1, b[i] = 1;else{if(sum1 > sum2)sum1--, sum2++, a[i] = 0, b[i] = 1;elsesum1++, sum2--, a[i] = 1, b[i] = 0;}}if(sum1 != sum2 || sum1 & 1){cout << "NO\n";continue;}for (int i = n; i >= 1; i--){if(sum1 == 0)break;if(s[i] == '1')a[i] = 0, b[i] = 0, sum1 -= 2, sum2 -= 2;}if(check()){cout << "YES\n";print();}elsecout << "NO\n";}return 0;
}

相关内容

热门资讯

热点推荐“贝众乐游到底有没有透... 热点推荐“贝众乐游到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“88娱乐城到底有没有... 热点推荐“88娱乐城到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获...
热点推荐“传奇德州到底有没有透... 您好,传奇德州这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
热点推荐“精品乐清麻将到底有没... 热点推荐“精品乐清麻将到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”...
热点推荐“湘叶娱乐到底有没有透... 热点推荐“湘叶娱乐到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“新友茶社到底有没有透... 您好,新友茶社这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
热点推荐“网上斗牛到底有没有透... 亲,网上斗牛这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,网上斗牛的开挂软件,名...
热点推荐“雀悦诏安麻将到底有没... 雀悦诏安麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“棋牌室到底有没有透视... 您好:棋牌室确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现...
热点推荐“微友联盟到底有没有透... 亲,微友联盟这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,微友联盟的开挂软件,名...
热点推荐“众联到底有没有透视挂... 热点推荐“众联到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能够完...
热点推荐“雀神麻将到底有没有透... 热点推荐“雀神麻将到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“越记乡游到底有没有透... 热点推荐“越记乡游到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获取...
热点推荐“麻友圈2贵州麻将到底... 您好:麻友圈2贵州麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打...
热点推荐“乐天棋牌到底有没有透... 热点推荐“乐天棋牌到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“海星到底有没有透视挂... 您好:海星确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现很...
热点推荐“潮汕馆到底有没有透视... 您好:潮汕馆确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现...
热点推荐“乐享贵州麻将到底有没... 乐享贵州麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“汇友娱乐到底有没有透... 您好:汇友娱乐确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“hhpoker脚本到... 热点推荐“hhpoker脚本到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的...