题意

给定一个长度为 \(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. 【GiraKoo】could not find UI helper 'git-credential-manager-ui'

    环境 Windows 11 git version 2.39.0.windows.1 TortoiseGit 现象 使用TortoiseGit执行git pull命令时,提示could not fin ...

  2. [TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数

    做什么 法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数. 这个SDK探幽日志主要是对目前SDK开发中遇到的一些问题 ...

  3. 如何同步更新 Github 上 Fork 的项目?

    Github Fork 过程概述 在 Github 上有很多优秀的开源项目,相信每一位热衷于技术的朋友都会在 Github 上 Fork 一些感兴趣的项目,然后在本地修改并提交.本文以 Galaxy ...

  4. 【Python】sqlmodel: Python 数据库管理ORM 的终极形态?

    ORM 大家都知道ORM(Object Relational Mapping)是一种将对象和关系数据库中的表进行映射的技术,它可以让开发者更加方便地操作数据库,而不用直接使用SQL语句. 直接使用SQ ...

  5. 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读

    总览 大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~ 继MetaAI 的 SAM后,OPPO 研究院发布识别一切模 ...

  6. Python Selenium UI自动化测试

    Python Selenium UI自动化测试 1.自动化测试基础 1.1 自动化测试的定义 将人为的测试行为转化为机器自动执行的过程 1.2 自动化测试的目的 减少成本,提高测试效率 减少人为因素对 ...

  7. Taro项目引入Tailwindcss

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别,同时还补全各种浏览器模式前缀,兼容性也不错.它的工作原理是扫描所有 HTML 文件.JavaScri ...

  8. 6大数据实战系列-sparkSql实战

    sparkSql两个最重要的类SqlContext.DataFrame,DataFrame功能强大,能够与rdd互转换.支持sql操作如sql().where.order.join.groupBy.l ...

  9. 曲线艺术编程 coding curves 第十二章 超级椭圆与超级方程(Superellipses and Superformulas)

    第十三章 超级椭圆与超级方程(Superellipses and Superformulas) 原作:Keith Peters https://www.bit-101.com/blog/2022/11 ...

  10. Java 输入字符串,统计大写字母,小写字母,数字字符的个数

    代码如下: public static void main(String[] args) { String str = "AaFsECvcS12483fs+-*/"; int bi ...