首页 > 其他分享 >AtCoder ABC307D 题解

AtCoder ABC307D 题解

时间:2023-07-02 19:11:37浏览次数:46  
标签:AtCoder ABC307D int 题解 ++ stk 括号 配对

AtCoder ABC307D Mismatched Parentheses 题解

思路分析

First —— 配对括号序列

首先,每个右括号肯定是要与其左边最近的左括号配对。因此,我们便可以使用一个栈来进行存放左括号的下标。当有右括号时,便可以弹出栈顶元素,但是栈为空时,便无法配对。

拿样例 1 举个例子:

8
a(b(d))c

当 $ i = 1 $时(下标从 \(0\) 开始),入栈 \(1\)。

此时的栈:1

当 $ i = 3 $时,入栈 \(3\)。

此时的栈:1 3

当 $ i = 5 $时,弹出 \(3\),将 \(f_3 \gets 1\),\(f_5 \gets 2\)。

此时的 \(f\) 数组如下:

0 0 0 1 0 2 0 0

此时的栈:1

以此类推。

最后,\(f\) 数组如下:

0 1 0 1 0 2 2 0

这时,我们已经完成了括号序列的配对。

Second —— 去除括号内容

现在,我们可以定义数组 \(l\)。

  • \(l_i = 1\),表示此项被去除。
  • \(l_i = 0\),表示此项没有被去除。

如何构造 \(l\) 呢?

我们可以定义一个 \(x\),表示我们正在第 \(x\) 层括号中。

  • \(f_i = 1\),表示进入括号,\(x\) 需要加 \(1\)。
  • \(f_i = 1\),表示离开括号,\(x\) 需要减 \(1\)。
  • \(x \ge 1\),表示在括号中,\(l_i \gets 1\)。

最后即可构造出 \(l\)。

Third —— 输出最终字符串

枚举 \(1\) 到 \(n\)。

  • \(l_i = 0\),输出 \(s_i\)。
  • \(l_i = 1\),不输出任何内容。

代码实现

此代码中三个循环分别代表了上文中的三个步骤。

注:在第二步中的复制的 if 语句需要前后两次判断,因为经过判断后 \(x\) 可能会改变。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n;
int x;
int f[N];
int l[N];
char s[N];
stack<int> stk;
int main()
{
    scanf("%d", &n);
    scanf("%s", s);
    for (int i = 0; i < n; i++)
    {
        if (s[i] == '(')
        {
            stk.push(i);
        }
        else if (s[i] == ')' && !stk.empty())
        {
            x = stk.top();
            stk.pop();
            f[x] = 1;
            f[i] = 2;
        }
    }
    x = 0;
    for (int i = 0; i < n; i++)
    {
        if (x > 0)
        {
            l[i] = 1;
        }
        if (f[i] == 1)
        {
            x++;
        }
        else if (f[i] == 2)
        {
            x--;
        }
        if (x > 0)
        {
            l[i] = 1;
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (!l[i])
        {
            printf("%c", s[i]);
        }
    }
    printf("\n");
    return 0;
}

标签:AtCoder,ABC307D,int,题解,++,stk,括号,配对
From: https://www.cnblogs.com/Redefinition/p/17521211.html

相关文章

  • 洛谷 P1081 题解
    P1081[NOIP2012提高组]开车旅行题解Link洛谷题目链接Solution首先考虑这道题的暴力做法,对于第一问,枚举每个起始点,暴力计算每个点之后最近和第二近的位置,计算答案,最后取最大值。对于第二问,对每个询问独立模拟即可。复杂度较高,无法通过此题。第一个优化:考虑到对于固定的当......
  • docker启动RabbitMQ以及常见问题解决
    docker启动MQ容器下载docker镜像dockersearchrabbitmqdockerpullrabbitmqdockerrun-d--hostnamemy-rabbit--namerabbit-p15672:15672-p5672:5672rabbitmq:latest启动容器后浏览器无法访问dockerexec-it3b124f0c9712/bin/bashrabbitmq-pluginsenab......
  • CF842E Nikita and game 题解
    题意一棵树初始只有一个编号为1的根结点。\(n\)次操作,每次新增一个点作为\(p_i\)的子结点,询问更新后有多少点可以作为树直径的端点。\(n\le3\times10^5\)。题解以下\(dist(x,y)\)表示点\(x\)与点\(y\)在树上的距离。不难发现若干条直径必然叠合于至少一点,任选这......
  • AtCoder Beginner Contest 308 A~F
    AtCoderBeginnerContest308手速有点慢A-NewScheme判断给定数字是否满足条件voidsolve(){ boolok=true; inta[10]; for(inti=1;i<=8;i++) cin>>a[i]; for(inti=1;i<=8;i++) { if(i>=2&&a[i]<a[i-1]) ok=......
  • Codeforces Round 881 Div2 A-F1题解
    codeforcesround881div2题解马上要秋招了,自己本事全丢了,感觉如果这样的话今年就估计要饿死了。先打div3,7月份得开始收心了A.SashaandArrayColoring题意,可以分任意组,每组的贡献是max-min,问最大贡献显然是贪心,从大到小配对一下就行,不想放代码了’B.LongLong给出一......
  • JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时,如果会出现异常:java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher是因为需要的类没有找到,一般,是因为少导入了JAR包,使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-bean......
  • AtCoder Beginner Contest 308
    A:1#include<cstdio>2#include<cstring>3#include<algorithm>4#include<iostream>5#include<string>6#include<vector>7#include<stack>8#include<bitset>9#include<cstdlib>10#include......
  • 【atcoder beginner 308E - MEX】
    前缀和二分查找打表枚举代码如下importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;importjava.util.ArrayList;importjava.util.List;publicclassMain{publicstaticIntege......
  • dpkg-reconfigure命令找不到问题解决
    作者: adminhttps://cloudbool.com/archive/dpkg-reconfigure-command-not-found.html今天在SSH远程连接到服务器时,遇到了dpkg-reconfigure命令找不到的问题,觉得很是奇怪,花了点时间研究下,这里做个记录,以备后用。前情提要我远程的服务器系统是自行使用DebiannetinstISO镜......
  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......