【CF1153C】—Serval and Parenthesis Sequence(贪心)

                                              Serval and Parenthesis Sequence

萨瓦尔很快就告别了贾帕里幼儿园,开始了他在贾帕里小学的生活。

在他最喜欢的数学课上,老师教了他以下有趣的定义。

括号序列是一个字符串,只包含字符“(”和“)”。

一个正确的括号序列是一个括号序列,它可以通过在序列的原始字符之间插入字符“1”和“+”转换成一个正确的算术表达式。例如,括号序列“()()”, "(())"是正确的(得到的表达式是:"(1+1)+(1+1)"), "((1+1)+1)"),而")(" and ")"则不是。注意,根据定义,空字符串是一个正确的括号序列。

我们将|s|定义为字符串s的长度。一个严格前缀s[1…l](1≤l<|s|)的字符串s=s1s2…s|s|是字符串s1s2…sl。注意,根据定义,空字符串和整个字符串都不是任何字符串的严格前缀。

学习了这些定义后,他提出了一个新问题。他写下一个只包含字符“(”、“)”和“?”的字符串。他要做的是,把s中的每个"?"单独替换成一个"("和")"使新序列的所有严格前缀都不是正确的括号序列,而新序列应该是正确的括号序列。

毕竟,他只是一个小学生,所以这个问题对他来说太难解决了。作为他最好的朋友,你能帮他替换问号吗?如果有很多解决方案,其中任何一个都是可以接受的。

输入

第一行包含一个整数s | |(1≤|年代|≤3⋅105),字符串的长度。

第二行包含一个字符串s,只包含“(”、“)”和“?”。

输出

一行包含一个表示答案的字符串。

如果有很多解决方案,其中任何一个都是可以接受的。

如果没有答案,打印一行包含“:(”(没有引号)。

Examples

input

6
(?????

output

(()())

input

10
(???(???(?

output

:(

Note

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

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<bitset>
typedef long long ll;
const int INF=1e9+7;
const int xmax=1e5+7;
const double PI=acos(-1);
const int mod=100000;
using namespace std;
/**李洛克:只要能够靠努力的话,天才也是可以被打败的,那个时候的你曾经这样的跟我说过!
我想证明,即便是不会忍术,不会幻术,也能成为一名优秀的忍者,这是我生命的全部,这就是我的忍道! ——岸本齐史**/
int main()
{
    int n;
    cin>>n;
    char s[xmax*3];
    int l=0,r=0;    ///l,r分别记录'('和')'的个数
    for(int i=1;i<=n;i++){
         cin>>s[i];
         if(s[i]=='(')
            l++;
         else if(s[i]==')')
            r++;
    }

    if(n%2||s[1]==')'||s[n]=='('){
        cout<<":(";
        return 0;
    }
    l=n/2-l;r=n/2-r;    
    ///因为该字符串满足'('和')'的个数相等,所以对整个字符串,剩下的'?'都需要转化为'('或')'
    for(int i=1;i<=n;i++)
    {
        ///先对n/2之前的'?',如果还剩余l未填完,就把s[i]更新为'('
        if(s[i]=='?'&&l)
        {
            s[i]='(';
            l--;
        }
        ///剩下的更新为')'
        else if(s[i]=='?'&&r)
        {
            s[i]=')';
            r--;
        }
    }
    ///因为该字符串需要满足其任意前缀和(除了整个字符串)都满足不是正确的字符串序列,所以需要判断
    int tmp=0;
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='(')   tmp++;
        if(s[i]==')')   tmp--;
        ///如果')'的个数在i!=n时已经比'('大于或相等的话,就不满足条件
        if(tmp<=0&&i!=n)
        {
            cout<<":(";
            return 0;
        }
    }
    if(!tmp)
    {
        for(int i=1;i<=n;i++)
            cout<<s[i];
    }
    else    ///如果'('和')'的个数不相同,输出":)"
        cout<<":(";
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值