1 条题解
-
0
- 枚举平衡子数组里可能存在的字符组合
- 前缀和+map
#include <bits/stdc++.h> using namespace std; // 只有 1 个字符 int solve1(const string& s) { int n = s.size(), ans = 0; for (int i = 0, j; i < n; i++) { j = i; while (i + 1 < n && s[i + 1] == s[i]) i++; ans = max(ans, i - j + 1); } return ans; } // 2 个字符, 需要 cnt(a) == cnt(b) // s[0..l] 的 a, b 次数为 [al, bl] // s[0..r] 的 a, b 次数为 [ar, br] // 那么子串 s[l + 1, r] 满足: // ar - al == br - bl, 移项: // ar - br == al - bl // 我们维护 ar - br 就好 int solve2(const string& s, char a, char b) { int n = s.size(), ans = 0; int x = 0; // cnt[a] - cnt[b] map<int, int> q; q[0] = 0; for (int i = 1; i <= n; i++) { if (s[i - 1] == a) x++; else if (s[i - 1] == b) x--; if (q.count(x)) ans = max(ans, i - q[x]); else q[x] = i; } return ans; } int solve(const string& s) { return max(solve1(s), solve2(s, 'a', 'b')); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; string s; cin >> T; while (T--) { cin >> s; cout << solve(s) << '\n'; } return 0; }
- 1
信息
- ID
- 203
- 时间
- 100ms
- 内存
- 32MiB
- 难度
- 6
- 标签
- 递交数
- 79
- 已通过
- 25
- 上传者