-
H - Streets of Working Lanterns
- Gym - 101149H
- 题意:括号匹配,有很多"?",这些"?"可以凑成任意一种,判断最后能否恢复成匹配模式的括号
- 思路:更改"?".肯定与位置有关所以需要存储,入栈同时要保留位置,然后先进行原来的括号匹配 。
- 匹配完之后进行“?”凑数,一定要注意位置关系,此时栈内如果还有没匹配的括号,那应该先把它们的
- 顺序反转一下,这样便于接下来尽可能地让前面的“?”去跟“)”匹配,后面的“?”与“(”去匹配。
- 如果整个过程都能顺利进行的话,最后检验一下剩下的"?"数目是否是偶数即可。
-
#include<bits/stdc++.h> using namespace std; string str; int sum,len,s1,s2,s3,s4,s,ord,cnt,R,L; vector<int>q; vector<int>pp; int main() { ios::sync_with_stdio(false); cin>>str; stack<pair<char,int> >stk,st; len=str.size(); for(int i=0; i<len; i++) { if(str[i]=='?') { q.push_back(i); sum++; continue; } if(st.empty()) st.push(make_pair(str[i],i)); else { if(st.top().first=='('&&str[i]==')') st.pop(); else st.push(make_pair(str[i],i)); } } while(!st.empty()) { stk.push(st.top()); st.pop(); } s=stk.size(); if(sum<s) cout<<"Impossible"<<endl; else { bool flag=0; sort(q.begin(),q.end()); while(!stk.empty()) { if(L==sum) { flag=1; break; } ord=stk.top().second; if(stk.top().first==')'&&L<sum) { if(ord>q[L]) { str[q[L]]='('; L++; stk.pop(); } else { flag=1; break; } } else if(stk.top().first=='('&&L<sum) { if(ord<q[L]) { str[q[L]]=')'; L++; stk.pop(); } else pp.push_back(q[L++]); } } if(flag) cout<<"Impossible"<<endl; else { if(s!=0) for(int i=L; i<sum; i++) pp.push_back(q[i]); R=pp.size(); if(R==0) { if(L==sum) cout<<str<<endl; else { if(sum%2==1) cout<<"Impossible"<<endl; else { for(int i=0; i<sum/2; i++) str[q[i]]='('; for(int i=sum/2; i<sum; i++) str[q[i]]=')'; cout<<str<<endl; } } } else { if(R%2==1) cout<<"Impossible"<<endl; else { for(int i=0; i<R/2; i++) str[pp[i]]='('; for(int i=R/2; i<R; i++) str[pp[i]]=')'; cout<<str<<endl; } } } } return 0; }
H - Streets of Working Lanterns Gym - 101149H -括号匹配-栈模拟
最新推荐文章于 2019-05-04 21:57:20 发布
621

被折叠的 条评论
为什么被折叠?



