제출 #548265

#제출 시각아이디문제언어결과실행 시간메모리
548265leakedMatch (CEOI16_match)C++17
37 / 100
2084 ms2236 KiB
#include <bits/stdc++.h>

#define f first
#define s second
#define m_p make_pair
#define vec vector
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define sz(x) (int)(x).size()
#define pw(x) (1LL<<(x))
#define fast_prep ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
//#define int long long
template<class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);}
template<class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);}
const int N=1e5+1;
struct dsu{
    int p[N];
    void make(int v){
        p[v]=v;
    }
    dsu(){
        iota(p,p+N,0);
    }
    int get(int v){
        return p[v]=(p[v]==v?v:get(p[v]));
    }
}lt,rt;

signed main(){
    fast_prep;
    string s;
    cin>>s;
    int n=sz(s);
    vec<int> lft(n),rgt(n);
    string ans(n,'-');
    stack<int> st;
    vec<int>p(n);
    for(int i=0;i<n;i++){
        if(!sz(st)) st.push(i),ans[i]='(';
        else{
            if(s[st.top()]==s[i]){
                ans[i]=')';
                p[st.top()]=i;
                p[i]=st.top();
                st.pop();
            }
            else{
                ans[i]='(';
                st.push(i);
            }
        }
    }
    if(sz(st)){
        cout<<-1;
        return 0;
    }
//    vec<vec<int>> have(26,vec<iCnt>());
//    for(int i=0;i<n;i++) have[s[i]-'a'].pb(i);
    auto check=[&](int j){
        stack<int> stt=st;
        for(int i=j;i<n;i++){
            if(!sz(stt)) stt.push(i),ans[i]='(';
            else{
                if(s[stt.top()]==s[i]){
                    ans[i]=')';
                    stt.pop();
                }
                else{
                    ans[i]='(';
                    stt.push(i);
                }
            }
        }
        return (!sz(stt));
    };
//    cerr<<"ANS "<<ans<<endl;
    for(int i=0;i<n;i++){
//        for(auto &j : {'(',')'}){
            ans[i]='(';
            st.push(i);
            if(check(i+1)){
                continue;
            }
            else{
                st.pop();
                assert(sz(st) && s[st.top()]==s[i]);
                st.pop();
                ans[i]=')';
            }
//        }
    }
    cout<<ans;
    return 0;
}
/*
cbbbbccbbccbbbbbbc
(((((((()))())))))

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...