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的主要内容,如果未能解决你的问题,请参考以下文章

179竞赛

km之路--001 brackets

Brackets编辑器怎样自动格式化HTML代码

今日SGU 5.15

json 用于代码的自定义快捷键在Brackets中展开/折叠

如何在 Adob​​e-Brackets 中打开 PHP 自动完成