当前位置: 首页 > news >正文

A. Balance the Bits (思维构造)

A. Balance the Bits

思维构造…

分析

首先一般这种题就两种情况:

  1. 从特殊到一般;
  2. 排除不可能的,剩下的是可能的;

首先我们排除不可能的情况:
如果有前导0或后缀0, 显然不可能, 因为0要翻转, 这种情况必然有一个串不合法;
如果s的1的个数是奇数, 则也不行;
如果cnt1是奇数, 此时用1分的左右括号必然有一个是奇数;
n为偶数, 则cnt0也是奇数, 此时用0分的左右括号必然有一个是奇数;
又0会翻转, 则会发现两个串中必然有一个串出现左右括号都是奇数的情况;

排除完后就是可行的情况, 此时cnt1 cnt0都是偶数, 我们考虑构造:
先构造1的: 前一半为( , 后一半为 ), 显然此时不构造0的时候是合法的;
再构造0: 考虑下面这种构造情况:
s1 : )()()()(
s2 : ()()()()
这样1的情况和0的情况合在一起就能合法, 每个括号必然能找到匹配的括号.

代码

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<map>
#include<algorithm>
#include<deque>
#include<stack>
#include<set>
#include <random>
#include<bitset>
// #include <unordered_map>
#include<math.h>
#include<string.h>
#define IOS ios::sync_with_stdio(false),cin.tie(0);
using namespace std;
 
#define pb push_back
#define coutl cout<<"------------"<<endl;
#define fi first
#define se second

#define ire(x) scanf("%d",&x)
#define iire(a,b) scanf("%d %d",&a,&b)
#define lre(x) scanf("%lld",&x)
#define llre(a,b) scanf("%lld %lld",&a,&b)
#define dre(x) scanf("%lf",&x)
#define ddre(a,b) scanf("%lf %lf",&a,&b)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define endl "\n"
#define PI acos(-1.0)
//#define int long long
// #define double long double
// typedef __int128 ll;
typedef long long ll;
typedef unsigned long long ull;

typedef pair<int, int> PII;
typedef pair<double, int> PDI;
typedef pair<ll, ll> PLL;
typedef pair<double, double> PDD;
typedef pair<double, pair<int, double> > PDID;
typedef pair<char, char> PCC;
typedef pair<char, pair<int, int> > PCII;
typedef pair<int, pair<int, int> > PIII;
typedef pair<int, pair<int, pair<int, int> > > PIIII;
typedef pair<ll, pair<int, int> > PLII;

const int maxn = 1e5 + 7;
const int N = 5e5 + 7;
const int M = 5e5 + 7;
const int mod = 998244353;
const int inv = mod - mod/2;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1);
const double eps = 1e-8;
  
ll gcd(ll a,ll b) {return b==0 ? a : gcd(b,a%b);}
ll lcm(ll a,ll b) {return a*b / gcd(a,b);}
ll qmi(ll a,ll b,ll p) {ll ans = 1; while(b) { if(b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans;}
int lowbit(int x) {return x & (-x);}

void solve()
{
	int n;
	string s;
	cin>>n>>s;
	
	int cnt = 0;
	for(int i=0;i<s.size();i++) if(s[i] == '1') cnt++;
	if((cnt & 1) || s[0] == '0' || s[s.size()-1] == '0')
	{
		cout<<"NO\n";
		return;
	}
	
	string ans1,ans2;
	vector<int> v1,v0;
	for(int i=0;i<n;i++)
	{
		if(s[i] == '1') v1.push_back(i);
		else v0.push_back(i);
		
		ans1 += '0';
		ans2 += '0';
	}
	
	for(int i=0;i<v1.size()/2;i++) ans1[v1[i]] = ans2[v1[i]] = '(';
	for(int i=v1.size()/2;i<v1.size();i++) ans1[v1[i]] = ans2[v1[i]] = ')';
	
	if(v0.size())
	{
	    ans1[v0[0]] = ')';
    	ans1[v0.back()] = '(';
    	for(int i=1;i<v0.size()-1;i+=2)
    	{
    		ans1[v0[i]] = '(';
    		ans1[v0[i+1]] = ')';
    	}
    	
    	for(int i=0;i<v0.size();i+=2)
    	{
    		ans2[v0[i]] = '(';
    		ans2[v0[i+1]] = ')';
    	}
	}
	
	cout<<"YES\n";
	cout<<ans1<<'\n'<<ans2<<'\n';
}

int main()
{
	IOS;
	
	int t;
//	ire(t);
	cin>>t;
//  	t = 1;
	while(t--)
	{
		solve();
	}
	
 	return 0;
}

	

相关文章:

  • k8s系列(二)——云计算相关概念
  • 数据挖掘学习笔记01——数据挖掘的基本流程
  • 分布式缓存Hazelcast的部署及与SpringBoot整合使用
  • 1.5 Elasticsearch文档的基本操作
  • 微电网|含分布式发电的微电网中储能装置容量优化配置(Matlab代码实现)
  • postgresql 服务器日志
  • c++ 中map 的find 用法
  • 《MeInGame: Create a Game Character Face from a Single Portrait 》论文解读
  • 实现多线程的方式
  • 精通Java必备的100道面试题——面向对象面试题
  • Tcmalloc内存分配算法的分析
  • 中国按摩器行业市场需求与投资规划分析报告
  • 分布式医疗大数据存储方案研究综述
  • BOPPPS+课程思政教学模式在计算机导论课程中的应用
  • 中国冶金工程行业数据专项调研分析报告
  • SegmentFault for Android 3.0 发布
  • Angular Elements 及其运作原理
  • angular学习第一篇-----环境搭建
  • Bootstrap JS插件Alert源码分析
  • ES6简单总结(搭配简单的讲解和小案例)
  • input的行数自动增减
  • React组件设计模式(一)
  • vue:响应原理
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 工作手记之html2canvas使用概述
  • 力扣(LeetCode)56
  • 两列自适应布局方案整理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 实战|智能家居行业移动应用性能分析
  • 一个项目push到多个远程Git仓库
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #pragma multi_compile #pragma shader_feature
  • #pragma once与条件编译
  • #pragma 指令
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (vue)页面文件上传获取:action地址
  • (补)B+树一些思想
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • *1 计算机基础和操作系统基础及几大协议
  • .net 程序发生了一个不可捕获的异常
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET命令行(CLI)常用命令
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET业务框架的构建
  • .NET中winform传递参数至Url并获得返回值或文件
  • .NET中两种OCR方式对比
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • []T 还是 []*T, 这是一个问题
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Android学习笔记]ScrollView的使用
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [codeforces]Checkpoints
  • [Head First设计模式]策略模式
  • [java/jdbc]插入数据时获取自增长主键的值
  • [JavaEE] 线程与进程的区别详解