【题目描述】:
天天和()是好朋友,然而总是唱反调。对于一个有() 的字符串,天天总是会把()内的所有东西都倒过来读。
比如对于字符串abc(def) ,天天看到的就是abcfed 。
括号里面可能是空的,也有可能套有多个括号,比如说abc(hello)(world)lcy()x(owq(zrt)),天天看到的就是abcollehdlrowlcyxzrtqwo 。
因为(owq(zrt))首先变成了(trz)qwo ,接下来变成了zrtqwo ,zrt 被反转了两次,所以天天看到的还是zrt。
现在给你一个字符串,问你天天看到的是什么样子的?
【输入描述】:
一行一个字符串,表示原始的字符串。保证字符串内只有小写字母和(以及)组成。保证括号总是配对的。
【输出描述】:
一行一个字符串,表示天天看到的字符串。
【样例输入1】:
abc(hello)(world)lcy()x(owq(zrt))
【样例输出1】:
abcollehdlrowlcyxzrtqwo
【样例输入2】:
(y(g(el)da)nis)
【样例输出2】:
singleday
【样例输入3】:
mian()
【样例输出3】:
mian
【时间限制、数据范围及描述】:
时间:1s 空间:256M
对于10% 的数据,保证只出现一对括号,字符串长度小于100,000。
对于另外30% 的数据,保证字符串长度小于100。
对于另外40% 的数据,保证字符串长度小于100,000。
对于剩余的20% 的数据,保证字符串长度小于500,000。
本题还是很有价值的一题,主要就是记住奇括号就倒着来,偶括号就正着来,还有,dfs是个好东西,只要写一层所有的问题就都解决了.
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int N=500005;
int a[N],b[N],j;
char s[N];
stack<int> q;
void work(int l,int r,int t){
if(t%2==0){
for(int i=l;i<=r;i++){
if(s[i]!='('&&s[i]!=')'){
printf("%c",s[i]);
}
else if(s[i]=='('){
work(i+1,a[i]-1,t+1);
i=a[i];
}
}
return;
}
if(t%2==1){
for(int i=r;i>=l;i--){
if(s[i]!='('&&s[i]!=')'){
printf("%c",s[i]);
}
else if(s[i]==')'){
work(b[i]+1,i-1,t+1);
i=b[i];
}
}
}
return;
}
int main(){
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len;i++){
if(s[i]=='('){
q.push(i);
}
if(s[i]==')'){
a[q.top()]=i;
b[i]=q.top();
q.pop();
}
}
work(1,len,0);
return 0;
}