C. Serval and Parenthesis Sequence 【括号匹配】 Codeforces Round #551 (Div. 2)

时间:2022-08-29 18:04:57

冲鸭,去刷题:http://codeforces.com/contest/1153/problem/C

C. Serval and Parenthesis Sequence
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Serval soon said goodbye to Japari kindergarten, and began his life in Japari Primary School.

In his favorite math class, the teacher taught him the following interesting definitions.

A parenthesis sequence is a string, containing only characters "(" and ")".

A correct parenthesis sequence is a parenthesis sequence that can be transformed into a correct arithmetic expression by inserting characters "1" and "+" between the original characters of the sequence. For example, parenthesis sequences "()()", "(())" are correct (the resulting expressions are: "(1+1)+(1+1)", "((1+1)+1)"), while ")(" and ")" are not. Note that the empty string is a correct parenthesis sequence by definition.

We define that |s||s| as the length of string ss. A strict prefix s[1…l]s[1…l] (1≤l<|s|)(1≤l<|s|) of a string s=s1s2…s|s|s=s1s2…s|s| is string s1s2…sls1s2…sl. Note that the empty string and the whole string are not strict prefixes of any string by the definition.

Having learned these definitions, he comes up with a new problem. He writes down a string ss containing only characters "(", ")" and "?". And what he is going to do, is to replace each of the "?" in ss independently by one of "(" and ")" to make all strict prefixes of the new sequence not a correct parenthesis sequence, while the new sequence should be a correct parenthesis sequence.

After all, he is just a primary school student so this problem is too hard for him to solve. As his best friend, can you help him to replace the question marks? If there are many solutions, any of them is acceptable.

Input

The first line contains a single integer |s||s| (1≤|s|≤3⋅1051≤|s|≤3⋅105), the length of the string.

The second line contains a string ss, containing only "(", ")" and "?".

Output

A single line contains a string representing the answer.

If there are many solutions, any of them is acceptable.

If there is no answer, print a single line containing ":(" (without the quotes).

Examples
input
Copy
6
(?????
output
Copy
(()())
input
Copy
10
(???(???(?
output
Copy
:(
Note

It can be proved that there is no solution for the second sample, so print ":(".

解题思路:

括号匹配问题,但要求 严格前缀不满足括号匹配,但是整个字符满足括号匹配。

解题思路:

括号匹配easy,给一组数据:

8

((??))))

答案:(((())))

如何处理 ' ? ' 这里有一个贪心, 就是如果满足括号匹配,那么左括号和右括号肯定各占一半。

先扫一遍,统计已出现的左括号和右括号,

然后再扫一遍 如果遇到 ' ? ' 先满足达到 N/2 个 左括号(左括号肯定越前越好), 然后再满足 N/2 个右括号。

最后扫一遍判断修改后的字符串是否满足括号匹配,如果中途出现栈空的情况说明有严格前缀也符合括号匹配,则不行;最后栈不为空也不行,否者输出答案。

AC code:

 #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
#define inc(i, j, k) for(int i = j; i <= k; i++)
#define rep(i, j, k) for(int i = j; i < k; i++)
#define mem(i, j) memset(i, j, sizeof(i))
#define gcd(i, j) __gcd(i, j)
using namespace std;
string ss;
stack<char>mmp;
int N, a, b;
int main()
{
scanf("%d", &N);
cin >> ss;
if(N%){ puts(":("); return ;}
for(int i = ; i < N; i++)
{
if(ss[i] == '(') a++;
else if(ss[i] == ')') b++;
}
bool flag = true;
int n1 = N/-a;
int n2 = N/-b;
int k = ;
for(int i = ; i < n1;k++){
if(ss[k] == '?'){ ss[k] = '('; i++;}
}
for(int j = ; j < n2; k++){
if(ss[k] == '?'){ ss[k] = ')';j++;}
}
// cout << ss << endl;
for(int i = ; i < N; i++){
if(mmp.size() == ){
mmp.push(ss[i]);
continue;
}
if(ss[i] == '('){
mmp.push(ss[i]);
}
else{
if(mmp.top() == '(') mmp.pop();
else mmp.push(ss[i]);
if(mmp.size() == && i != N-){ flag = false;break; }
}
}
if(mmp.size() == && flag) cout << ss << endl;
else puts(":("); return ;
}

C. Serval and Parenthesis Sequence 【括号匹配】 Codeforces Round #551 (Div. 2)的更多相关文章

  1. 【Codeforces】Codeforces Round &num;551 &lpar;Div&period; 2&rpar;

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

  2. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; A-E

    A. Serval and Bus 算出每辆车会在什么时候上车, 取min即可 #include<cstdio> #include<algorithm> #include&lt ...

  3. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; A~E题解

    突然发现上一场没有写,那就补补吧 本来这场应该5题的,结果一念之差E fail了 A. Serval and Bus 基本数学不解释,假如你没有+1 -1真的不好意思见人了 #include<c ...

  4. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; D&period; Serval and Rooted Tree &lpar;树形dp&rpar;

    题目:http://codeforces.com/contest/1153/problem/D 题意:给你一棵树,每个节点有一个操作,0代表取子节点中最小的那个值,1代表取子节点中最大的值,叶子节点的 ...

  5. Codeforces Round &num;551 &lpar;Div&period; 2&rpar;A&period; Serval and Bus

    A. Serval and Bus time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. Codeforces Round &num;551 &lpar;Div&period; 2&rpar;B&period; Serval and Toy Bricks

    B. Serval and Toy Bricks time limit per test 1 second memory limit per test 256 megabytes input stan ...

  7. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; D&period; Serval and Rooted Tree (树形dp)

    题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...

  8. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; E&period; Serval and Snake &lpar;交互题&rpar;

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

  9. Codeforces Round &num;551 &lpar;Div&period; 2&rpar; F&period; Serval and Bonus Problem (DP&sol;FFT)

    yyb大佬的博客 这线段期望好神啊... 还有O(nlogn)FFTO(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客 本蒟蒻只会O(n2)O(n^2)O(n2) CODE ...

随机推荐

  1. Git 教程

    Git 教程 新建 模板 小书匠 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容. Git使用 Git - 关于版本控制 TortoiseGit日常 ...

  2. 【poj1260】 Pearls

    http://poj.org/problem?id=1260 (题目链接) 题意 购买珍珠,所有珍珠分成n个档次,第i个档次购买每个珍珠的价格为p[i],需要购买第i档次的珍珠a[i]个.若要购买第i ...

  3. C&plus;&plus; 实现 发送HTTP Get&sol;Post请求 good

    1.简述 最近简单看了一下关于HTTP请求方面的知识,之前一直用Qt来实现,有专门HTTP请求的QNetworkAccessManager类来处理,实现也比较简单,这里主要讲解一下用C++代码来实现H ...

  4. java&lowbar;反射&lowbar;及其简单应用(2016-11-16)

    话不多说直接上代码 接口: package bean; /** * user接口 */ public interface User { public String getName(); public ...

  5. 线性布局&lpar;LinearLayout&rpar;

    线性布局(LinearLayout) 备注 match_parent填充布局单元内尽可能多的空间 wrap_content完整显示控件内容 orientation有两个值,horizontal水平显示 ...

  6. ILRuntime&lowbar;NewbieGuide—入门

    注:这里不会讲ILRuntime的热更新原理,如果还不是很清楚原理,请先移步到官方文档:https://ourpalm.github.io/ILRuntime/public/v1/guide/inde ...

  7. BZOJ 4552 &lbrack;Tjoi2016&amp&semi;Heoi2016&rsqb;排序 线段树的分裂和合并

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...

  8. Python&&num;160&semi;在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  9. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

  10. 20145127《java程序设计》第一次实验

    <java程序设计>第一次实验 实验内容及其步骤 1.使用JDK编写简单的Java小程序: Java编译的方法有很多,最基础最简单的就是使用命令行,记事本,Java虚拟机直接进行编译,下面 ...