题意

给定一个长度为 \(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. OODO有关账户account模块学习

    一.记账凭证(Account Move) 会计上的记账凭证,也叫会计分录,在Odoo中叫"Account Move".Account Move直译是"账户移动" ...

  2. 驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<驱动开发:内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntim ...

  3. C++程序开发技巧

    引言 类(class)的使用分为两种--基于对象(object Based)和面向对象(object oriented) 基于对象是指,程序设计中单一的类,和其他类没有任何关系 单一的类又分为:不带指 ...

  4. 曲线艺术编程 coding curves 第六章 平托图 (Pintographs)

    第六章 平托图 (Pintographs) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗( ...

  5. 项目小结:使用Docker迁移服务到离线服务器

    前言 最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程. 基本信息 原本这套系统也 ...

  6. SpringBoot进阶教程(七十六)多维度排序查询

    在项目中经常能遇到,需要对某些数据集合进行多维度排序的需求.对于集合多条件排序解决方案也有很多,今天我们就介绍一种,思路大致是设置一个分值的集合,这个分值是按照需求来设定大小的,再根据分值的大小对集合 ...

  7. CentOS7 配置本地yum源软件仓库

    CentOS7 配置本地yum源软件仓库 前言 配置本地yum源软件仓库可以离线状态下安装本地已有的软件 先连接虚拟光驱,对应的光驱iso文件 查看磁盘分区状态 可以看到sr0 未挂载 [root@l ...

  8. JavaScript学习笔记 - 语法篇 - 一句废话没有版

    写在前面: 绝不废话!放心食用 JavaScript语法很简单,可以直接在控制台调试理解 目录 1.变量和常量 2.数据类型 3.字符串 3.1 模板字符串 3.2 字符串的部分常用函数 4.数组 5 ...

  9. CSS3+Jquery实现带动画效果的下拉选择框

    CSS3+JQuery实现带动画效果的下拉选择框. 元素结构为: 1 <div class="box"> 2 <p>this is the first li ...

  10. 如何从AWS中学习如何使用AmazonVPC

    目录 如何从 AWS 中学习如何使用 Amazon VPC? 随着 AWS 的迅速发展,Amazon VPC(Virtual Private Cloud)已经成为了一种非常重要的云计算基础设施.VPC ...