题意

给定一个长度为 \(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. 自从用了 Kiali 以后才知道,配置 Istio 的 流量管理 是如此容易

    在生产环境中,直接登录服务器是非常不方便的,我们可以使用Kiali配置Istio的流量管理. 本文以Istio官方提供的Bookinfo应用示例为例,使用Kiali配置Istio的流量管理.Booki ...

  2. CANoe学习笔记(三):CANoe的诊断功能和cdd文件

    内容: UDS诊断学习 CDD文件配置 诊断功能 一.UDS诊断学习: ①.UDS请求命令4种构成方式: SIDSID+SF(Sub-function)SID+DID(Data Identifier) ...

  3. 深度解读 Linux 内核级通用内存池 —— kmalloc 体系

    本文是笔者 slab 系列的最后一篇文章,为了方便大家快速检索,先将相关的文章列举出来: <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现> <从内核源码看 sl ...

  4. 2 大数据实战系列-spark shell wordcount

    1 启动spark shell cd /home/data/app/hadoop/spark-2.1.1-bin-hadoop2.7/bin ./spark-shell --master spark: ...

  5. 从2PC和容错共识算法讨论zookeeper中的Create请求

    最近在读<数据密集型应用系统设计>,其中谈到了zookeeper对容错共识算法的应用.这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以 ...

  6. React组件三大属性state,props,refs

    1. React组件定义 1.1 函数组件(Function Components) 函数组件是一种简单的定义组件的方式,通过一个JavaScript函数来定义组件.函数接收一个props对象作为参数 ...

  7. Taurus .Net Core 微服务开源框架:Admin 插件【4-1】 - 配置管理-Kestrel【含https启用】

    前言: 继上篇:Taurus .Net Core 微服务开源框架:Admin 插件[3] - 指标统计管理 本篇继续介绍下一个内容: 1.系统配置节点:App - Config 界面 界面图如下: 双 ...

  8. opensbi入门

    OpenSBI 入门 声明 本文为本人原创,未经允许,严禁转载. FW_JUMP FW_PAYLOAD FW_DYNAMIC FW_JUMP OpenSBI 带跳转地址的固件(FW_JUMP)是一种仅 ...

  9. EasyExcel · 写excel

    原文地址 通用数据生成 后面不会重复写 private List<DemoData> data() { List<DemoData> list = ListUtils.newA ...

  10. OO第一次大作业

    前言 前言的前言 这是我的第一篇blog,有点小激动,我还找教程设置了一下我的背景,本来还想弄个页面小宠物,但是看了一下感觉有点复杂,下次一定.如果对我blog的内容有任何修正或者建议可以评论让我知道 ...