sgu 179 Brackets light
Posted gaudar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sgu 179 Brackets light相关的知识,希望对你有一定的参考价值。
题意:假设‘(‘<‘)‘,给出一个匹配的串,问下一个匹配的串。
看标程输出的结果很久才发现转换机制。
从右边开始,忽略长度为2的()子串。
1.如果右边有‘()‘子串:找到第一个(,换成‘)‘
(1).如果新产生了单独的‘()‘,和后面的合并成(((((())))))这样的。
(2)如果没有,就将后面的全填入()中,比如((()))()()->(() ((())) ),因为(() () (()) )不是最优的。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #define mkp make_pair using namespace std; const double EPS=1e-8; const int SZ=800010,INF=0x7FFFFFFF; typedef long long lon; string work(string str) { int i; int num1=0,num2=1; for(i=str.size()-2;i>=0;i-=2) { if(!(str[i]==‘(‘&&str[i+1]==‘)‘))break; num1+=2; } if(i<0)return ""; for(;!(str[i]==‘(‘&&str[i+1]==‘)‘);--i,++num2); //cout<<i<<" "<<num2<<endl; string res=""; if(num1==0) { string tmp(str.begin(),str.begin()+str.size()-num2-1); tmp+=")("; string tmp2(str.begin()+str.size()-num2+1,str.end()); res=tmp+tmp2; } else { if(num2!=2) { string tmp(str.begin(),str.begin()+str.size()-num2-num1-1); tmp+=")("; tmp+=string(num1/2,‘(‘)+string(num1/2,‘)‘); string tmp2(str.begin()+str.size()-num2-num1+1,str.end()-num1); res=tmp+tmp2; } else { string tmp(str.begin(),str.begin()+str.size()-num2-num1-1); tmp+=")"; string tmp2((num1+num2)/2,‘(‘); res=tmp+tmp2+string((num1+num2)/2,‘)‘); } } return res; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\1.txt","r",stdin); lon casenum=INF; string str; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { cin>>str; str=work(str); if(str=="")cout<<"No solution"<<endl; else cout<<str<<endl; } return 0; }
2.如果没有:找到第一个(),换成)(。结果必定能匹配,因为任一前缀‘)‘不多于‘(’成立。并且右边不能再翻,因为都是‘)’,翻了数量不等。
以上是关于sgu 179 Brackets light的主要内容,如果未能解决你的问题,请参考以下文章