题意

给定一个长度为 \(n\) 的小括号序列,求有多少个位置满足将这个位置的括号方向反过来后使得新序列是一个合法的括号序列。即在任意一个位置前缀左括号的个数不少于前缀右括号的个数,同时整个序列左右括号个数相同。

分析

括号序列显然采取前缀和思想,将\('('\)记做\(1\),将\(')'\)记做\(-1\),记为\(sum[]\)数组,并统计\('('\)的前缀和,即为\(suml[]\)数组,统计\(')'\)的前缀和,即为\(sumr[]\)数组。

可以发现,对于某一个序列,只能翻转\('('\)或\(')'\)一种类型,分类进行分析:

\((1)\)\('('\)比\(')'\)多\(2\)个,则翻转\('('\)可以使得\(sum[n]\)变为\(0\)。考虑翻转第\(i\)位的\('('\)会产生的影响。对于\(i\leq j\leq n\)来说,所有的\(sum[j]\)都减去\(2\),所以要保证所有的\(sum[]\)都大于0,即找到\(i\),有

  • \(1\leq k <i\),\(sum[k]>=0\)
  • \(i < j \leq n\),\(sum[j]>=2\)
  • \(sum[i]=1\)

答案即为\(i\)~\(n\)中\('('\)数量。

\((2)\)\('('\)比\(')'\)少\(2\)个,可以通过翻转字符串并将所有的\('('\)和\(')'\)翻转获得第\((1)\)种情况。也可以通过考虑翻转第\(i\)位的\(')'\)会产生的影响,对于\(i\leq j\leq n\)来说,所有的\(sum[j]\)都加上\(2\),所以要保证所有的\(sum[]\)都大于0,即找到\(i\),有

  • \(1\leq k <i\),\(sum[k]>=0\)
  • \(i < j \leq n\),\(sum[j]>=-2\)
  • \(sum[i]=-1\)

答案即为\(1\)~\(i\)中的\(')'\)数量。

\((3)\)其他情况输出\(0\)即可,存在已经为括号序列的字符串,也存在不可能满足条件的字符串。

#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define LL long long
#define int ll
using namespace std;
const int maxn = (ll) 1e6 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
int sum[maxn];
int suml[maxn];
int sumr[maxn];
char s[maxn]; signed main() {
start;
int n;
cin >> n;
cin >> (s + 1);
for (int i = 1; i <= n; ++i) {
suml[i] = suml[i - 1];
sumr[i] = sumr[i - 1];
if (s[i] == '(')
sum[i] = sum[i - 1] + 1, ++suml[i];
else
sum[i] = sum[i - 1] - 1, ++sumr[i];
}
if (sum[n] == 2) {
for (int i = 1; i <= n; ++i)
if (sum[i] < 0) {
cout << 0;
return 0;
}
int l = n;
for (; l > 0; --l)
if (sum[l] == 1)
break;
cout << suml[n] - suml[l];
} else if (sum[n] == -2) {
for (int i = 1; i <= n; ++i)
if (sum[i] < -2) {
cout << 0;
return 0;
}
int l = 1;
for (; l <= n; ++l)
if (sum[l] == -1)
break;
cout << sumr[l];
} else
cout << 0;
return 0;
}

Codeforces-1095E-Almost-Regular-Bracket-Sequence的更多相关文章

  1. Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)

    题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次 ...

  2. Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)

    Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...

  3. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈

    C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...

  4. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  5. (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)

    (CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...

  6. 贪心+stack Codeforces Beta Round #5 C. Longest Regular Bracket Sequence

    题目传送门 /* 题意:求最长括号匹配的长度和它的个数 贪心+stack:用栈存放最近的左括号的位置,若是有右括号匹配,则记录它们的长度,更新最大值,可以在O (n)解决 详细解释:http://bl ...

  7. CodeForces - 612C Replace To Make Regular Bracket Sequence 压栈

    C. Replace To Make Regular Bracket Sequence time limit per test 1 second memory limit per test 256 m ...

  8. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

  9. Replace To Make Regular Bracket Sequence

    Replace To Make Regular Bracket Sequence You are given string s consists of opening and closing brac ...

  10. CF1095E Almost Regular Bracket Sequence

    题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...

随机推荐

  1. Nodejs 应用编译构建提速建议

    编译构建的整体过程 拉取编译镜像 拉取缓存镜像 拉取项目源码 挂载缓存目录 执行编译命令(用户自定义) 持久化缓存 上传编译镜像 为什么在本地构建就快, 但编译机上很慢 在编辑机上每次的构建环境都是全 ...

  2. 代码随想录算法训练营Day18 二叉树|  654.最大二叉树  617.合并二叉树  700.二叉搜索树中的搜索  98.验证二叉搜索树

    654.最大二叉树 题目链接:654.最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地 ...

  3. hosts文件妙用,提升网站访问速度!

    一.背景 在讲解hosts文件之前,我们先了解下IP地址与域名的关系. 1.IP地址与域名的关系 IP(Internet Protocol)是一种规定互联网中数据传输的协议,每台连接到互联网中的计算机 ...

  4. [ARM汇编]计算机原理与数制基础—1.1.1计算机的基本原理

    计算机是一种能够根据指令集自动.高速处理数据的现代化设备.它的基本原理可以总结为:输入.存储.处理和输出数据.接下来,我们将详细介绍这些基本原理. 输入 计算机通过输入设备(如键盘.鼠标等)接收外部数 ...

  5. 掌握把“烂”SQL牢牢关进笼子里的密钥

    摘要:本文通过5个部分内容帮助开发者快速了解GaussDB(DWS) 资源管理机制,让数仓过载烦恼不再,把"烂"SQL牢牢关进笼子里. 本文分享自华为云社区<直播回顾 | 掌 ...

  6. 万字长文 | Hadoop 上云: 存算分离架构设计与迁移实践

    一面数据原有的技术架构是在线下机房中使用 CDH 构建的大数据集群.自公司成立以来,每年都保持着高速增长,业务的增长带来了数据量的剧增. 在过去几年中,我们按照每 1 到 2 年的规划扩容硬件,但往往 ...

  7. .NET Core中关于阿拉伯语环境下的坑:Input string was not in a correct format.

    结论 .NET Core项目(.NET Framework没出现)在阿拉伯语(即语言名称是ar-开头的语言)环境下,将负数字符串转成数字,即int.Parse("-1")或Conv ...

  8. CocosCreator + Vscode + Ts 代码注释生成文档,利用typedoc

    需求: 脚本的代码注释,生成为文档 基本搭建环境: (cocoscreator 2.4.x + vscode + ts) .(nodejs + npm) 步骤: 1.安装typedoc: npm in ...

  9. Java面试题全集(二)

    1. ⾸先CopyOnWriteArrayList内部也是⽤过数组来实现的,在向CopyOnWriteArrayList添加元素时,会复制⼀个新的数组,写操作在新数组上进⾏,读操作在原数组上进⾏ 2. ...

  10. CPU摸鱼被抓,上了一个新技术!

    我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴. 我们CPU的任务就是执行程序员编写的程序,只不过程序员编写的是高级语言代码,而我们执行的是这些代码被 ...