这题,我们发现题目的神仙操作实际上就是镜像翻转,对已经合法的括号序列不会产生影响。所以我们可以把合法的都无视,只留下形如")))))(((("的一堆东西,然后就很好操作了。
#include <bits/stdc++.h>
#define ll long long
#define fr(i,x,y) for(int i=x;i<=y;i++)
#define rf(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const int N=1002;
int n;
int L,st[N];
template<class T> void checkmin(T &a,const T &b) { if (b<a) a=b; }
template<class T> void checkmax(T &a,const T &b) { if (b>a) a=b; }
class ParenthesesDiv1Easy {
public:
vector <int> correct( string s ) ;
};
vector <int> ParenthesesDiv1Easy::correct(string s) {
n=s.size();
for(int i=0;i<n;i++)
if (s[i]=='(') st[++L]=i;
else{
if (s[st[L]]=='('&&L) L--;
else st[++L]=i;
}
int cnt1=0,cnt2=0;
fr(i,1,L) if (s[st[i]]=='(') cnt2++;else cnt1++;
fr(i,1,L) cout<<st[i]<<' ';
vector<int> ans;
if (L==0) return ans;
if (L&1) return {-1};
if (cnt1&&cnt2){
ans.push_back(st[max(1,cnt1-cnt2+1)]);ans.push_back(st[cnt1]);
ans.push_back(st[cnt1+1]);ans.push_back(st[min(L,2*cnt1)]);
}
if (cnt1<cnt2) ans.push_back(st[L-(cnt2-cnt1)/2+1]),ans.push_back(st[L]);
if (cnt1>cnt2) ans.push_back(st[1]),ans.push_back(st[(cnt1-cnt2)/2]);
return ans;
}