zoukankan      html  css  js  c++  java
  • CodeForces

    A bracket sequence is a string, containing only characters “(”, “)”, “[” and “]”.

    A correct bracket sequence is a bracket sequence that can be transformed into a correct arithmetic expression by inserting characters “1” and “+” between the original characters of the sequence. For example, bracket sequences “()[]”, “([])” are correct (the resulting expressions are: “(1)+[1]”, “([1+1]+1)”), and “](” and “[” are not. The empty string is a correct bracket sequence by definition.

    A substring s[l… r] (1 ≤ l ≤ r ≤ |s|) of string s = s1s2… s|s| (where |s| is the length of string s) is the string slsl + 1… sr. The empty string is a substring of any string by definition.

    You are given a bracket sequence, not necessarily correct. Find its substring which is a correct bracket sequence and contains as many opening square brackets «[» as possible.

    Input
    The first and the only line contains the bracket sequence as a string, consisting only of characters “(”, “)”, “[” and “]”. It is guaranteed that the string is non-empty and its length doesn’t exceed 105 characters.

    Output
    In the first line print a single integer — the number of brackets «[» in the required bracket sequence. In the second line print the optimal sequence. If there are more than one optimal solutions print any of them.
    Examples

    Input
    ([])
    Output
    1
    ([])
    Input
    (((
    Output
    0
    括号是就近匹配的,所以可以用栈来模拟,所以可以将括号压栈,匹配后出栈,最后栈底剩余的就是不能出栈的就是不能匹配的,一般的方法是找到这些括号但是太费劲了,我们同时建立一个栈,同时入栈,出栈,存括号的下标,那么在出栈操作之后,第一个stack就只剩下不匹配的括号,第二个stack就只剩下不匹配的括号的下标。
    下标将括号数组分成了好几段,枚举每一段的左中括号的数量即可,比较最大值更新左右段点即可

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=100005;
    int b[maxn]={0};
    stack<int>demo;
    stack<int>de;
    vector<int>ans;
    string a;
    int main()
    {
        while(!demo.empty())demo.pop();
        while(!de.empty())de.pop();
        ans.clear(); 
        //初始化操作
        
        cin>>a;
        int n=a.size();
        for(int i=0;i<a.size();i++)
        {
            if(a[i]=='(') b[i]=-2;
            else  if(a[i]==')') b[i]=2;
            else if(a[i]=='[') b[i]=-1;
            else b[i]=1;
        }
        for(int i=0;i<n;i++){
            if(demo.empty()||b[i]==-1||b[i]==-2)
            {
                demo.push(b[i]);
                de.push(i);
            }
            else if(b[i]+demo.top()==0)
            {
                demo.pop();
                de.pop();
            }
        else{
                demo.push(a[i]);
                de.push(i);
            }
        }
        if(demo.empty())
        {
            int res=0;
            for(int i=0;i<a.size();i++) if(a[i]=='[') res++;
            cout<<res<<endl<<a<<endl;
            return 0;
        }
        while(!de.empty())
        {
            ans.push_back(de.top());
            de.pop();
        }
        ans.push_back(n);//补足区间
        sort(ans.begin(),ans.end());
        
        int l,r=-1, /*补足区间*/ml,mr,res=0,maxi=0;
         for(int i=0;i<ans.size();i++)
        {
            l=r+1;
            r=ans[i];
            res=0;
            for(int i=l;i<r;i++)
            {
                if(a[i]=='[') res++;
            }
            if(res>maxi)
            {
                ml=l;mr=r-1;
                maxi=res;
            }
        }
        if(maxi==0){
            cout<<0<<endl;
            return 0;
        }
        cout<<maxi<<endl;
        for(int i=ml;i<=mr;i++)  cout<<a[i];
        cout<<endl;
    }
    
    
  • 相关阅读:
    2020.10.13辗转相除法
    关于……
    友情链接
    李群笔记
    c++中的复数
    python快速傅里叶变换
    多参数函数共轭梯度法寻找极值:gsl_multimin_fdfminimizer
    python: matplotlib.pyplot 制作动图
    简易威尔逊云室计划
    大规模矩阵对角化方法:Lanczos
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798831.html
Copyright © 2011-2022 走看看