http://www.elijahqi.win/archives/906
这题方法real神奇啊,本来想用splay搞,但发现都忘记了,无可奈何,只好写了暴力骗一些分
正解:相当于用一个栈递归打印
我们每次遇到括号就把我们的标记翻转一下
然后根据标记从前往后或从后往前
#include<cstdio>
#include<cstring>
#include<stack>
#define N 550000
std::stack<int> q;
char s[N];int l[N],r[N];
void print(int ll,int rr,int rev){
if (rev){
for (int i=rr;i>=ll;--i){
if (s[i]==')') print(r[i]+1,i-1,rev^1),i=r[i];else
printf("%c",s[i]);
}
}else{
for (int i=ll;i<=rr;++i){
if (s[i]=='(') print(i+1,l[i]-1,rev^1),i=l[i];else
printf("%c",s[i]);
}
}
}
int main(){
freopen("unknown.in","r",stdin);
scanf("%s",s+1);
int n=strlen(s+1);
int cnt=0;
for (int i=1;i<=n;++i){
if (s[i]=='(') q.push(i);
if (s[i]==')') l[q.top()]=i,r[i]=q.top(),q.pop();
}
//for (int i=1;i<=n;++i) printf("%d %d\n",l[i],r[i]);
print(1,n,0);
return 0;
}