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;
}

相关内容

热门资讯

安卓系统43适配软件,软件升级... 你有没有发现,你的安卓手机最近是不是有点儿“水土不服”?别急,别急,让我来给你揭秘为什么你的安卓系统...
安卓系统有车载系统吗吗,智能驾... 你有没有想过,当你坐在车里,享受着旅途的悠闲时光,手机上的安卓系统是不是也能派上用场呢?没错,我就要...
安卓8.1系统解锁方法,畅享自... 你有没有想过,你的安卓手机里隐藏着无数的小秘密?比如,解锁安卓8.1系统,就能让你的手机焕发出全新的...
安卓系统怎么打开邮件,安卓系统... 你有没有想过,每天那么多邮件,怎么才能快速打开它们呢?尤其是当你用的是安卓系统手机的时候。别急,今天...
封闭安卓系统安装软件,一步到位... 你有没有想过,为什么你的安卓手机里有些软件只能通过官方渠道安装呢?今天,就让我带你一探究竟,揭开封闭...
小米mipad升级安卓系统,解... 你有没有发现,最近小米Mipad的安卓系统升级可是个大热门呢!这不,我就迫不及待地来和你聊聊这个话题...
哪个安卓系统体验好,揭秘安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的版本就是不同的拿手好菜,有的让你回味无穷,有的却让...
安卓系统开发测试,全方位技术解... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,是怎么从无到有,一步步成长起来的呢?今天...
安卓系统怎么查配置,轻松掌握设... 你有没有想过,你的安卓手机里藏着多少秘密?别小看这些配置信息,它们可是了解你手机性能的“小侦探”呢!...
pve下安装安卓系统,PVE环... 你有没有想过,在你的PVE服务器上安装一个安卓系统呢?听起来是不是有点酷炫?想象你的服务器不仅能够运...
安卓手机安装虹膜系统,安卓手机... 你有没有想过,你的安卓手机还能这样玩?没错,就是安装虹膜系统!听起来是不是有点酷炫?别急,让我带你一...
小米论坛原生安卓系统,深度解析... 你有没有想过,你的手机系统其实可以更加纯粹、更加原生?今天,就让我带你走进小米论坛,一探究竟,看看那...
安卓怎么装iphone系统,轻... 你是不是也和我一样,对安卓手机上的iPhone系统充满了好奇?想象那流畅的界面、强大的性能,还有那独...
模拟器系统安卓,打造移动应用开... 你有没有想过,在手机上也能体验到电脑游戏的快感?没错,这就是安卓模拟器系统的魅力所在!今天,就让我带...
安卓系统清理系统更新包,提升运... 手机里的安卓系统是不是越来越慢了?别急,今天就来给你支个招,让你的安卓手机焕然一新!那就是——清理系...
酷开系统是安卓系统不,深度解析... 亲爱的读者,你是否曾好奇过,那些在我们手机、电视上运行得风生水起的操作系统,它们之间究竟有何不同?今...
小说系统类游戏安卓,安卓世界逆... 你有没有想过,在手机上玩一款能让你瞬间穿越到小说世界的游戏?想象你不再是旁观者,而是故事的主角,那种...
安卓系统网页上传文件,安卓系统... 你有没有遇到过这种情况:手机里存了好多文件,想要上传到网页上分享,却发现安卓系统的操作有点儿复杂?别...
xp系统能刷安卓系统吗,体验全... 你有没有想过,你的老XP系统是不是也能玩转安卓的乐趣呢?没错,今天就来聊聊这个话题,看看XP系统能不...
安卓系统图标修改方法,让你的手... 你有没有发现,手机里的安卓系统图标总是那么单调乏味?是不是也想给它们换上新鲜的衣服,让手机界面焕然一...