CodeForces - 224C. Bracket Sequence (栈模拟)简单做法

时间:2022-07-28
本文章向大家介绍CodeForces - 224C. Bracket Sequence (栈模拟)简单做法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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;
}