标签:pid else top amp href set 序列 matching space
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6799
题目大意: 给你一个由左右括号和乘法符号组成的字符串 ()* ,可以将*变成左括号或、右括号、空字符,求能生成的最短的合法括号序列 中字典序最小的。(左括号字典序小于右括号)
合法括号序列举例: () ((())) ()()(())
题解:
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 }
[hud-6799] Parentheses Matching 构造 括号匹配 2020多校3
标签:pid else top amp href set 序列 matching space
原文地址:https://www.cnblogs.com/conver/p/13396546.html