rt,同一份代码每次提交都MLE或TLE不同的点
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define ll long long
#define N 100005
#define endl "\n"
#define fi first
#define se second
using namespace std;
const ll mod=1e9+7;
string s;
ll n;
ll hsh[N];
ll has1[N],has2[N],now1,a[N];
map<ll,vector<ll> >v;
stack<ll> q;
void sol(ll l,ll r){
if(r<l)return;
ll t1=(hsh[l-1]+s[l]-'a'+1);
a[l]=1;
ll t2=(*--upper_bound(v[t1].begin(),v[t1].end(),r));
a[t2]=2;
sol(l+1,t2-1);
sol(t2+1,r);
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>s;
n=s.size();
s=" "+s;
srand(time(0));
for(int i=1;i<=n;i++){
has1[i]=rand()%1000;
has2[i]=rand()%2000;
}
v[0].push_back(0);
hsh[0]=0;
for(int i=1;i<=n;i++){
ll t=s[i]-'a'+1;
if(!q.empty()&&q.top()==t){
ll p=q.size();
q.pop();
now1-=(has1[p]*t)*(has2[p]*t);
}else{
q.push(t);
ll p=q.size();
now1+=(has1[p]*t)*(has2[p]*t);
}
hsh[i]=now1;
v[(now1+t)].push_back(i);
}
if(!q.empty()){
cout<<"-1";
return 0;
}
sol(1,n);
for(int i=1;i<=n;i++){
cout<<(a[i]==1?"(":")");
}
return 0;
}