首页 > 其他分享 >A1/2/3 Balanced Unshuffle

A1/2/3 Balanced Unshuffle

时间:2024-05-06 20:57:00浏览次数:13  
标签:PB cur ... int A1 嵌套 Balanced Unshuffle

A1

A2

A3

这个是比赛中我为队贡献的最有价值的一题,写一下吧。以下就是我的思考过程。

A1

别人做的。但是签到,略。

A2, A3

因为 A2, A3 方法差不多,就直接说 \(\mathcal{O}(n)\) 的做法。

我们来研究一个例子 ((()))()(())。他的前驱为 ((()()))()()

我们能得到的消息有,Prefix balance(PB) 为 \(0\) 的有 \(3\) 个,因为 ((()))()(()) 开头有 \(3\) 个 (。(为什么呢?因为 ) 显然 PB\(\ge 1\),而且如果是小于 \(3\) 个,一定会先出现一个 ),他是倒序排的)。所以,我们知道前驱是 (...)(...)(...) 这样的一个东西。

有 \(3\) 个 (,一定会对应三个 ),所以 ((()))()(()) 中的 \(4\) 到 \(6\) 都是 PB 为 \(1\) 的。怎么确定第 \(7\) 个呢?同样,如果 PB 为 \(2\),一定是 )。所以,第 \(7\) 个 PB 为一。所以,我们知道前驱是 ((...)(...)(...) 这样的一个东西。

第 \(8\) 个告诉我们是 ((...))(...)(...) 这样的一个东西。类似的,第 \(9,10\) 个告诉我们是 ((...(...(...))(...)(...) 这样的一个东西。最有两个,根据 PB 的值,我们就得到 ((()()))()() 了!

这只是一个例子。我们怎么用具体描述?

按照 PB 把 ((()))()(()) 分类,有 ((( 是 \(0\),)))( 是 \(1\),)(( 是 \(2\),)) 是 \(3\)。我们可以发现,对于 PB 是 \(i+1\) 的,塔里面的 ) 数量是 \(i+1\) 里的 ( 数量。) 够了,要一直加到不是 ( 为止。我们就求出哪些括号是什么 PB 了。

上面的东西,我们把 \(i+1\) 中的 ) 移到 \(i\) 里面,我们得到了:((()))()(()),这说明,是 ()()()()()() 逐层嵌套的形式。因为是 PB 相同的时候按照从大到小的编号,所以,约在后的要嵌套到前面。比如说,()() 嵌套在 () 里,变成 (()())。因为是 )))(,所以 (()()) 应该嵌套在 ()()() 的第一个里面,变成了 ((()()))()()

具体是第几个,就是 reverse 后前面有多少个 ) 加一个。很好理解。因此我们把嵌套的连一条边然后 dfs 就可以 \(\mathcal{O}(n)\) 做完了。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 5e5+5;

string s;
vector<string> v;
vector<int> g[N],e[N];
int cnts[N],id[N];

void dfs(int u){
	if (e[u].size()==0){
		cout<<"()";
		return;
	}
	if (u) cout<<"(";
	for (auto v : e[u]){
		dfs(v);
	}
	if (u) cout<<")";
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>s;
	int i=0;
	string cur;
	while (s[i]=='('){
		cur.push_back('(');
		i++;
	}
	v.push_back(cur);
	int cnt=cur.size();
	cur.clear();
	while (i<s.size()){
		int ct=0,cc=0;
		while (ct<cnt){
			ct+=(s[i]==')');
			cc+=(s[i]=='(');
			cur.push_back(s[i]);
			i++;
		}
		while (i<s.size() && s[i]=='('){
			cc++;
			cur.push_back(s[i]);
			i++;
		}
		v.push_back(cur);
		cur="";
		cnt=cc;
	}
	for (int i=0; i<v.size(); i++){
		reverse(v[i].begin(),v[i].end());
	}
	for (int i=0; i+1<v.size(); i++){
		int cl=0;
		for (auto ch : v[i]){
			cl+=(ch=='(');
		}
		cnts[i]=cl;
	}
	for (int i=0; i<cnts[0]; i++){
		e[0].push_back(i+1);
	}
	id[0]=1;
	int sum=cnts[0];
	for (int i=1; i+1<v.size(); i++){
		id[i]=sum+1;
		sum+=cnts[i];
	}
	for (int i=0; i+1<v.size(); i++){
		int cur=0,cnt=0;
		for (auto ch : v[i+1]){
			if (ch=='('){
				e[id[i]+cur].push_back(id[i+1]+cnt);
				cnt++;
			}
			else{
				cur++;
			}
		}
	}
	dfs(0);
	return 0;
}

标签:PB,cur,...,int,A1,嵌套,Balanced,Unshuffle
From: https://www.cnblogs.com/SFlyer/p/18175867

相关文章

  • JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活
    JuiceFSv1.2-beta1今天正式发布。在这个版本中,除了进行了大量使用体验优化和bug修复外,新增三个特性:Gateway功能扩展:新增了“身份和访问管理(IdentityandAccessManagement,IAM)”与“事件通知”,为用户提供更安全、灵活和自动化的数据管理和监控能力,适用于多用户环境和复......
  • UVA1362 Exploring Pyramids 题解
    题目传送门前置知识欧拉序|区间DP|乘法原理解法DFS序可近似理解为欧拉序,故考虑区间DP。设\(f_{l,r}\)表示\([l,r]\)对应的二叉树的个数,状态转移方程为\(f_{l,r}=\begin{cases}1&l=r\\[s_{l}=s_{r}]\times\sum\limits_{i=l+2}^{r}[s_{l}=s_{i}]\timesf_{......
  • (中文规格)FPGA - 现场可编程门阵列: XC7S15-1CPGA196I、LCMXO3L-4300C-5BG256C,FS32K142
    1、XC7S15-1CPGA196I  Spartan®-7现场可编程门阵列产品种类:FPGA-现场可编程门阵列系列:XC7S15逻辑元件数量:12800LE自适应逻辑模块-ALM:2000ALM嵌入式内存:360kbit输入/输出端数量:100I/O电源电压-最小:950mV电源电压-最大:1.05V最小工作温度:-40°C最大工作温度:+100°C数......
  • UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 0: invalid
    报错:报错信息UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xa1inposition0:invalidstartbyte指出在尝试使用UTF-8编码解码文件时遇到了问题。这通常发生在文件的编码不是UTF-8时,比如它可能是GBK、GB2312或其他编码。哈工大停用词表可能不是用UTF-8......
  • 【Java】java1.8安装教程及java环境配置
    一、下载JDK源文件1、根据自己系统,下载对应的文件下载地址:Java存档下载-JavaSE8u211及更高版本|Oracle中国 2、下载后,可将安装包移动到自定义目录中,然后双击文件进行安装操作 二、安装1、双击安装文件,根据安装向导指引,点击下一步,进行安装 2、点击下一步后,根......
  • 2024年JAVA1.8于window10系统下的安装安装
    2024年JAVA1.8于window10系统下的安装安装导航2024年JAVA1.8于window10系统下的安装安装导航一、下载JAVA1.8二、安装JAVA1.8三、配置环境一、下载JAVA1.8Oracle官网各历史版本:https://www.oracle.com/cn/java/technologies/downloads/archive/首先,我们选择这个版本......
  • UVA1500 Alice and Bob
    Statement:link给\(n\)个数\(a_1,a_2...,a_n\)。先手\(\rmAlice\)和后手\(\rmBob\)有两个操作。\(del(i)\)令\(a_i=a_i-1\),必须满足\(a_i>0\)。\(merge(i,j)\),将\(i,j\)合并,必须满足\(a_i,a_j>0\)若一个人不能进行操作,则判他输。若两人都......
  • PTA1-3总结w
    <1>前言:知识点:1.类的定义:代码中定义了三个类,Question、Answer和Paper,分别用来表示问题、答案和试卷。每个类都包含了相应的属性和方法。2.对象的创建:在main方法中通过new关键字创建了Question、Answer和Paper类的对象,然后对对象的属性进行赋值和操作。3.HashMap的使用:代码......
  • Alpha1
    @目录一、团队展示二、第一次团队讨论三、团队完成情况四、团队感悟一、团队展示二、第一次团队讨论商讨怎么实现前后端交互,窗体美化三、团队完成情况1.图书管理系统完成2.数据库设计完成3.正在学习怎么让winForm窗体和前端交互四、团队感悟基础不太好,任务分配不合理,而且......
  • [题解]SP10606 Balanced Numbers
    SP10606BalancedNumbers关于优化方式的说明详见数位dp例题及详解-下。SPOJ注册不上所以暂时无法提交w,但是3份代码与正解对拍没有问题。使用\(vis[0\sim9]\)表示\(0\sim9\)的访问情况,\(sta[0\sim9]\)表示\(0\sim9\)填写个数的奇偶性(奇数为\(1\),偶数为\(0\))。暴搜先打出来,......