#include <bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; vector<pair<int, int>> bloki{{1, s[0]}}; for (int i = 1; i < n; i++) { if (s[i] == s[i-1]) bloki.back().first++; else bloki.push_back({1, s[i]}); } multiset<int> jeden, dwa; int m = bloki.size(); int res = 0; if (m == 1 && bloki[0].second == '0') { cout << "0\n"; return; } if (bloki[0].second == '0') jeden.insert(bloki[0].first); if (m > 1 && bloki.back().second == '0') jeden.insert(bloki.back().first); for (int i = 1; i < m - 1; i++) { if (bloki[i].second == '0' && bloki[i].first > 1) { dwa.insert(bloki[i].first); } else if (bloki[i].second == '0' && bloki[i].first == 1) { jeden.insert(bloki[i].first); } } for (auto i : bloki) if (i.second == '1') res += i.first; int zjedzone = 0; while (!jeden.empty() || !dwa.empty()) { if (dwa.empty()) { jeden.erase(--jeden.end()); } else if(jeden.empty()) { auto it = --dwa.end(); jeden.insert(*it - 1); dwa.erase(it); } else { auto jit = --jeden.end(); auto dit = --dwa.end(); int j = *jit; int d = *dit; j -= zjedzone; d -= 2 * zjedzone; if (d > j + 2) { jeden.insert(*dit - 1); dwa.erase(dit); } else { jeden.erase(jit); } } res += jeden.size() + dwa.size() * 2; zjedzone++; while (!jeden.empty() && *jeden.begin() <= zjedzone) jeden.erase(jeden.begin()); while (!dwa.empty() && *dwa.begin() <= zjedzone * 2 + 1) { if (*dwa.begin() == zjedzone * 2 + 1) { jeden.insert(zjedzone + 1); } dwa.erase(dwa.begin()); } } cout << res << "\n"; } int32_t main() { ios_base::sync_with_stdio(0); int tests; cin >> tests; while(tests--) solve(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; vector<pair<int, int>> bloki{{1, s[0]}}; for (int i = 1; i < n; i++) { if (s[i] == s[i-1]) bloki.back().first++; else bloki.push_back({1, s[i]}); } multiset<int> jeden, dwa; int m = bloki.size(); int res = 0; if (m == 1 && bloki[0].second == '0') { cout << "0\n"; return; } if (bloki[0].second == '0') jeden.insert(bloki[0].first); if (m > 1 && bloki.back().second == '0') jeden.insert(bloki.back().first); for (int i = 1; i < m - 1; i++) { if (bloki[i].second == '0' && bloki[i].first > 1) { dwa.insert(bloki[i].first); } else if (bloki[i].second == '0' && bloki[i].first == 1) { jeden.insert(bloki[i].first); } } for (auto i : bloki) if (i.second == '1') res += i.first; int zjedzone = 0; while (!jeden.empty() || !dwa.empty()) { if (dwa.empty()) { jeden.erase(--jeden.end()); } else if(jeden.empty()) { auto it = --dwa.end(); jeden.insert(*it - 1); dwa.erase(it); } else { auto jit = --jeden.end(); auto dit = --dwa.end(); int j = *jit; int d = *dit; j -= zjedzone; d -= 2 * zjedzone; if (d > j + 2) { jeden.insert(*dit - 1); dwa.erase(dit); } else { jeden.erase(jit); } } res += jeden.size() + dwa.size() * 2; zjedzone++; while (!jeden.empty() && *jeden.begin() <= zjedzone) jeden.erase(jeden.begin()); while (!dwa.empty() && *dwa.begin() <= zjedzone * 2 + 1) { if (*dwa.begin() == zjedzone * 2 + 1) { jeden.insert(zjedzone + 1); } dwa.erase(dwa.begin()); } } cout << res << "\n"; } int32_t main() { ios_base::sync_with_stdio(0); int tests; cin >> tests; while(tests--) solve(); } |