题解:AT_abc350_f [ABC350F] Transpose
赛时:一眼平衡树,不会写。
思路
模拟。
维护一个 ,其中 表示现在模拟的区间是 ,正序还是倒序。
但是路途中可能会遇到括号,这时我们就要反方向模拟。
因此,我们需要预处理出每个左括号对应的右括号(右括号同理)。
这样,我们就能 地进入下一个模拟。
关于大小写转换,手搓几组样例就不难发现:
- 如果正序输出,大小写不变。
- 如果倒序输出,大小写互换。
这样,我们就能 地解决本题了。
#include<bits/stdc++.h>
using namespace std;
string s;
int n,ld[500005],rd[500005];
stack<int>st;
void dfs(int l,int r,int f) {
if(f==1) {
for(int i=l; i<=r; i++) {
if(s[i]=='('){
dfs(i+1,ld[i]-1,-1);
i=ld[i];
}
else{
cout<<s[i];
}
}
}
else{
for(int i=r;i>=l;i--){
if(s[i]==')'){
dfs(rd[i]+1,i-1,1);
i=rd[i];
}
else{
if('a'<=s[i]&&s[i]<='z')cout<<char(s[i]-'a'+'A');
else cout<<char(s[i]-'A'+'a');
}
}
}
}
int main() {
cin>>s;
n=s.length();
s=' '+s;
for(int i=1; i<=n; i++) {
if(s[i]=='(') {
st.push(i);
}
if(s[i]==')') {
int v=st.top();
st.pop();
ld[v]=i;
rd[i]=v;
}
}
dfs(1,n,1);
return 0;
}

浙公网安备 33010602011771号