ABC350 FG 题解
本人 Unrated 在开始后 1h 参加,20 分钟过 F,1h 过 G。
F
Overview
唐,史上最水 F。
Description
有一个串 S S S,包含大小写字母,(
和 )
,保证括号匹配。
对于每组匹配括号,从里往外翻转、改变大小写。
比如 ((A)y)x
,可以先变成 (ay)x
,再变成 YAx
。
求最终的 S S S。
Solution
首先确定每个字母的大小写再分治翻转就行了。
类似中缀表达式的求解过程。
O ( n log n ) O(n\log n) O(nlogn)。
Code
void solve(int ll, int r){
if(layer[r] & 1){
int i = r;
while(i >= ll){
if(s[i] == ')'){
solve(lst[i] + 1, i - 1), i = lst[i] - 1;
}
else cout << s[i], i--;
}
}
else{
int i = ll;
while(i <= r){
if(s[i] == '('){
solve(i + 1, nxt[i] - 1), i = nxt[i] + 1;
}
else cout << s[i], i++;
}
}
}
void solve(int testcase, ...){
init_vars();
cin >> s;
stack<int> st;
for(int i = 0; i < s.length(); i++){
if(i) layer[<