• [hud-6799] Parentheses Matching 构造 括号匹配 2020多校3


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6799

    题目大意: 给你一个由左右括号和乘法符号组成的字符串 ()* ,可以将*变成左括号或、右括号、空字符,求能生成的最短的合法括号序列 中字典序最小的。(左括号字典序小于右括号)

    合法括号序列举例: ()   ((()))   ()()(())

    题解:

    检测是否合法,左括号(入栈, 右括号)出栈。
    用队列记录*的位置
    如果碰到)括号但是栈空了,在最左边的星号*位置加左括号【如果最左边的星号位置都大于) 则无解
    最后扫完还有(括号, 在最右边的星号*位置加右括号 【最右边的星号位置都小于(则无解
    ac代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int const maxn=1e5+7;
     4 int flag,a[maxn],len,fr,tail;
     5 char s[maxn],ans[maxn];
     6 stack<int>q;
     7 /*
     8 检测是否合法,左括号(入栈, 右括号)出栈。
     9 用队列记录*的位置
    10 如果碰到)括号但是栈空了,在最左边的星号*位置加左括号【如果最左边的星号位置都大于) 则无解
    11 最后扫完还有(括号, 在最右边的星号*位置加右括号 【最右边的型号位置都小于(则无解
    12 */
    13 void work(){
    14     fr=0,tail=0;
    15     while(!q.empty())q.pop();//多组数据,要清空栈
    16     for(int i=0;i<len;i++){
    17         if(s[i]=='*'){
    18             a[++tail]=i;
    19         }
    20         else{
    21             if(s[i]=='('){
    22                 q.push(i);
    23                 ans[i]='(';
    24             }
    25             else{
    26                 if(!q.empty()){
    27                     q.pop();
    28                 }
    29                 else{
    30                     if(fr==tail){
    31                         flag=0;return ;
    32                     }
    33                     ans[a[++fr]]='(';
    34                 }
    35                 ans[i]=')';
    36             }
    37         }
    38     }
    39     int g;
    40     while(!q.empty()){
    41         g=q.top();q.pop();
    42         if(fr==tail||a[tail]<g){
    43             flag=0;return ;
    44         }
    45         ans[a[tail--]]=')';
    46     }
    47     flag=1;
    48 }
    49 void print(){
    50     if(!flag){
    51         printf("No solution!
    ");return;
    52     }
    53     for(int i=0;i<len;i++)if(ans[i]!=' '){
    54         printf("%c",ans[i]);
    55     }
    56     printf("
    ");
    57 }
    58 
    59 int main(){
    60     int t;
    61     scanf("%d",&t);
    62     while(t--){
    63         scanf("%s",s);
    64         len=strlen(s);
    65         memset(a,0,sizeof(len+5));
    66         for(int i=0;i<len;i++)ans[i]=' ';
    67         work();
    68         print();
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    re.match() and re.search()
    libxml2 使用教程【转】
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    前缀和、前缀积
    前缀和、前缀积
    前缀和、前缀积
    前缀和、前缀积
  • 原文地址:https://www.cnblogs.com/conver/p/13396546.html
Copyright © 2020-2023  润新知