码迷,mamicode.com
首页 > 其他好文 > 详细

sgu 179 Brackets light

时间:2018-10-15 21:45:11      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:mes   efi   ase   time   +=   ret   ons   nbsp   第一个   

题意:假设‘(‘<‘)‘,给出一个匹配的串,问下一个匹配的串。

看标程输出的结果很久才发现转换机制。

从右边开始,忽略长度为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

标签:mes   efi   ase   time   +=   ret   ons   nbsp   第一个   

原文地址:https://www.cnblogs.com/gaudar/p/9794853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!