CF1153C. Serval and Parenthesis Sequence

题目链接:CF1153C

题目大意

给你一个串,只包含字符 "(" ")" "?",问可不可以通过吧 "?" 变成括号,使得字符串s满足:
1.整个串是合法的括号序列
2.任何前缀都不是一个合法的括号序列
如果可以输出转换后的串,否则输出“:(”

Input

第一个行输入一个 t (1 \le t \le 3\times 10^5)表示字符串长度
第二行输入一个只含有题意中字符的串

Output

如果有解,输出这个解
没有则输出“:(”

样例

Input:

6
(?????

Output:

(()())

Input:

10
(???(???(?

Output:

:(

解题思路

s[0...t-1] ="(((?))?)"

一个串整体是合法括号序列,那么必有s[0]='('s[t-1]=')'
任意前缀都不是合法序列,那么去掉s的开头和结尾,剩下的中间这部分一定是一个合法括号序列。

对于s,开头结尾已经是"("和")"了,剩下部分用区间[l,r]表示:
s[l...r]=((?))?
需要让这段区间是合法序列,我们遍历这个区间,更改"?",从开头到每一个位置为止,左括号数量不能小于右括号的数量(多出的右括号会和s[0]凑成一个合法前缀),最后在这个区间中,左括号数量等于右括号数量的话,即为答案。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
string s;
int t;
int main(){
    cin>>t;
    cin>>s;
    if(t%2!=0
       ||t==0
       ||s[0]==')'
       ||s[t-1]=='('
       ){//答案一定是偶数长度的串,s[0]不是),s[t-1]不是(
            cout<<":("<<endl;
            return 0;
       }
    s[0]='(';
    s[t-1]=')'; //上面判断后 s[0] s[t-1] 一定可以改成这样
    int l=1,r=t-2; // 区间 [l,r]
    int jsl=0,jsr=0,f;
    for(int i=l;i<=r;i++){  //遍历扫一遍,统计左括号,右括号已经有多少个
        if(s[i]=='(') jsl++;
        else if(s[i]==')') jsr++;
    }

    int m = (r-l+1)/2; //如果区间长度是6,左括号右括号肯定不大能于3个,m=3;
    f=1; //记录结果是否可以
    if(jsl>m||jsr>m)f=0;
    int acl=0,acr=0; //遍历时,记录已经出现多少左括号和右括号
    if(f)
    for(int i=l;i<=r;i++){
       if(s[i]=='('){
            acl++; //左括号用正数表示
        }else if(s[i]==')'){
            acr--; //右括号用负数表示
            if(acl+acr<0){f=0;break;} //任何时候,右括号不能比左括号出现的多
        }else if(s[i]=='?'){
            if(acl+acr==0){ // 左右括号相等,"()",肯定放"("
                s[i]='(';
                acl++;
                jsl++;
                if(jsl>m){f=0;break;} //不能多于m个
            }else if(acl+acr<0){ //右括号不能比左括号多
                f=0;
                break;
            }else if(acl+acr>0){ //这里"("多,可以放"("或")",优先放"(",否则会错,比如s[l,r]="((?))?"
                if(jsl+1<=m){
                    s[i]='(';
                    acl++;
                    jsl++;
                }else{
                    s[i]=')';
                    jsr++;
                    acr--;
                    if(jsr>m){f=0;break;}
                }
            }
        }
    }
    if(f)
        if(!(acl+acr==0&&jsl<=m&&jsr<=m&&jsl+jsr==m*2))f=0;
    if(f)cout<<s<<endl;
    else cout<<":("<<endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 亲爱的女儿、今天就三周岁了。正式迈入三岁小孩的行列了,祝你生日快乐,愿你健康成长。
    夏沫_1c8d阅读 690评论 2 1
  • “怎么啦?”,看见一个年轻,有点胆怯的20来岁的女孩慢慢走进我诊室。 “医生,我想检一下胎”。 “几时的月经?大约...
    莹潼阅读 105评论 0 0