C. Balance the Bits
题目大意:
给你一个含有0和1字符的字符串,根据这个字符串构造两个不一样但是都合法的数学表达式,例如()()()合法而(()这种则不合法。字符串中的0代表两个数学表达式中不一样的括号,而1代表一样的括号
解法分析
- 首先,合法的数学表达式,必须在第一个括号为(和最后一个括号为),所以说给你的这个字符串的第一个和最后一个必须是1
- 由于0代表的是不同的括号,而1是相同的括号,且括号是有匹配性的,一个(必须匹配一个),所以,字符串中0的个数和1的个数应该都是偶数
- 满足以上条件,最后一步就是构造了,其中最简单的构造方法就是:字符串1和0分开构造,(和)分别有n/2个,对于1,假设有n1个,那么我们就把前n1/2个输出为(,后n1/2个输出为);对于0,我们就按照奇偶进行输出,第一种是为奇数个时,输出(,偶数个时输出),第二种只需和第一种在0是的输出正好相反就行了。
代码环节
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
char a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t,n;
int n1,n0;///不同的个数
cin>>t;
while(t--){
cin>>n;
cin>>a;
n0=0;
for(int i=0;i<n;i++)
if(a[i]=='0')
n0++;
int n1=n-n0;
if(n0%2==1||a[0]=='0'||a[n-1]=='0')
{
printf("NO\n");
continue;
}
printf("YES\n");
int n0p=0;
int n1p=0;
for(int i=0;i<n;i++){
if(a[i]=='0')
{
n0p++;
if(n0p%2==1)
printf("(");
else
printf(
")");
}
else
{
if(n1p<n1/2)
printf("(");
else
printf(")");
n1p++;
}
}
printf("\n");
n0p=0;
n1p=0;
for(int i=0;i<n;i++){
if(a[i]=='0')
{
n0p++;
if(n0p%2==1)
printf(")");
else
printf(
"(");
}
else
{
if(n1p<n1/2)
printf("(");
else
printf(")");
n1p++;
}
}
printf("\n");
}
return 0;
}