1 solutions
-
1
题意
要求括号内的字符串反转并且大小写转换。
思路
可以模拟,先用栈的思想,记录起每个括号对应的合法括号的位置, 表示我们当前在处理 区间,这个区间被翻转了 次,当 是奇数时,我们只需要对整个区间倒序处理,否则就正序,模拟即可。
#include <bits/stdc++.h> using namespace std; const int N = 5e5 + 5; const int mod = 1e9 + 7; int to[N]; string s; void solve(int l, int r, int rev) { if(r + rev == l) return; if (l == r) { if (rev == -1) { if (s[l] >= 'a' && s[l] <= 'z') { cout << (char)(s[l] - 'a' + 'A'); } else { cout << (char)(s[l] - 'A' + 'a'); } } else { cout << s[l]; } return; } for(int i = l;;) { if (s[i] == '(' || s[i] == ')') { solve(to[i] - rev, i + rev, rev * -1); i = to[i] + rev; } else { solve(i, i, rev); i += rev; } if (r + rev == i) break; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int tid; cin >> tid; cin >> s; int v = 0; vector<int> b; for(int i = 0; i < s.size(); i++) { if(s[i] == '(') { b.push_back(i); } else if(s[i] ==')') { int v = b.back(); to[v] = i; to[i] = v; b.pop_back(); } } solve(0, s.size() - 1, 1); return 0; }
- 1
Information
- ID
- 37
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 11
- Accepted
- 5
- Uploaded By