fork(1) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(nullptr);
  7.  
  8. int test_cases;
  9. if (!(cin >> test_cases)) return 0;
  10. while (test_cases--) {
  11. int length;
  12. string input_string;
  13. cin >> length >> input_string;
  14.  
  15. char dominant_char = input_string[0];
  16. int dominant_count = 0;
  17. for (char ch : input_string) {
  18. if (ch == dominant_char) {
  19. dominant_count++;
  20. }
  21. }
  22. int other_count = length - dominant_count;
  23. int balance_target = dominant_count - other_count;
  24.  
  25. if (balance_target == 0) {
  26. cout << 0 << '\n';
  27. continue;
  28. }
  29.  
  30. vector<int> prefix_balance(length + 1, 0);
  31. for (int j = 0; j < length; ++j) {
  32. prefix_balance[j + 1] = prefix_balance[j] + (input_string[j] == dominant_char ? 1 : -1);
  33. }
  34.  
  35. unordered_map<int, int> last_seen_balance;
  36. int min_removal = length + 1;
  37.  
  38. for (int j = 0; j <= length; ++j) {
  39. int required_balance = prefix_balance[j] - balance_target;
  40. auto finder = last_seen_balance.find(required_balance);
  41. if (finder != last_seen_balance.end()) {
  42. min_removal = min(min_removal, j - finder->second);
  43. }
  44. last_seen_balance[prefix_balance[j]] = j;
  45. }
  46.  
  47. if (min_removal > length) {
  48. cout << -1 << '\n';
  49. } else {
  50. cout << min_removal << '\n';
  51. }
  52. }
  53.  
  54. return 0;
  55. }
Success #stdin #stdout 0.01s 5288KB
stdin
5
5
bbbab
6
bbaaba
4
aaaa
12
aabbaaabbaab
5
aabaa
stdout
3
0
4
2
5