Submission #609770

#TimeUsernameProblemLanguageResultExecution timeMemory
609770DanerZeinMatch (CEOI16_match)C++14
37 / 100
2093 ms12768 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAX_N=1e5+10;
int n;
string x;
string ans;
int rabc[MAX_N][30];
int maxr(int l,int r){
  rabc[r][x[r]-'a']=r;
  if(rabc[r][x[l]-'a']!=-1) return rabc[r][x[l]-'a'];
  stack<int> st;
  st.push(r);
  for(int j=r-1;j>=l;j--){
    if(st.empty() || x[st.top()]!=x[j]){
      st.push(j);
    }
    else{
      int i=st.top();
      st.pop();
      if(st.empty()){
	if(rabc[r][x[j]-'a']==-1) rabc[r][x[j]-'a']=i;
	if(rabc[r][x[l]-'a']!=-1)
	  break;
      }
    }
  }
  return rabc[r][x[l]-'a'];
}
void match(int l,int r){
  if(l>=r){
    return;
  }
  int id=maxr(l,r);
  ans[l]='('; ans[id]=')';
  match(id+1,r);
  match(l+1,id-1);
}
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);
  cin>>x;
  n=x.size();
  stack<char> st;
  for(int j=0;j<n;j++){
    if(st.empty() || st.top()!=x[j]){
      st.push(x[j]);
    }
    else{
      st.pop();
    }
  }
  if(st.empty()){
    memset(rabc,-1,sizeof rabc);
    ans.resize(n);
    match(0,n-1);
    cout<<ans<<endl;
  }
  else cout<<"-1\n";
  
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...