[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!\n");return;
52     }
53     for(int i=0;i<len;i++)if(ans[i]!=' '){
54         printf("%c",ans[i]);
55     }
56     printf("\n");
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 }

猜你喜欢

转载自www.cnblogs.com/conver/p/13396546.html