#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define losuj(a, b) uniform_int_distribution<long long>(a, b)(rng) #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() #define f first #define s second #define pb push_back #define ii pair<int, int> #define vi vector<int> #define vii vector<ii> #define vvi vector<vi> #define vvii vector<vii> #define ll long long const int N = 1e6 + 7; int score2(int dl){ if(dl >= 3) return dl - 1; else return max(dl, 0); } void solve(){ int n; cin >> n; string s; cin >> s; string t = s; sort(all(t)); if(t[0] == t.back()){ if(t[0] == '0'){ cout << 0 << '\n'; } else{ cout << n << '\n'; } return; } vector<int> dwojki; vector<int> jedynki; int ost = -1; for(int i = 0; i < n; i++){ if(s[i] == '1'){ if(ost != i - 1){ if(ost == -1) jedynki.pb(i); else dwojki.pb(i - ost - 1); } ost = i; } } if(ost != n - 1) jedynki.pb(n - ost - 1); jedynki.pb(0); dwojki.pb(0); sort(all(jedynki)); sort(all(dwojki)); int ans = 0; int ind_jed = 0; int ind_dwa = 0; while(true){ int s1 = sz(jedynki) ? jedynki.back() * 2 : 0; int s2 = sz(dwojki) ? score2(dwojki.back()) : 0; if(max(s1, s2) == 0) break; if(s1 > s2){ ans += jedynki.back(); jedynki.pop_back(); } else{ jedynki.push_back(dwojki.back() - 1); dwojki.pop_back(); ans++; } for(int i = ind_dwa; i < sz(dwojki); i++){ dwojki[i] = max(0, dwojki[i] - 2); if(dwojki[i] == 0) ind_dwa++; } for(int i = ind_jed; i < sz(jedynki); i++){ jedynki[i] = max(0, jedynki[i] - 1); if(jedynki[i] == 0) ind_jed++; } } cout << n - ans << '\n'; } int main(){ ios::sync_with_stdio(0); cin.tie(0); int tests = 1; cin >> tests; for(int i = 0; i < tests; i++) solve(); return 0; }
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define losuj(a, b) uniform_int_distribution<long long>(a, b)(rng) #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() #define f first #define s second #define pb push_back #define ii pair<int, int> #define vi vector<int> #define vii vector<ii> #define vvi vector<vi> #define vvii vector<vii> #define ll long long const int N = 1e6 + 7; int score2(int dl){ if(dl >= 3) return dl - 1; else return max(dl, 0); } void solve(){ int n; cin >> n; string s; cin >> s; string t = s; sort(all(t)); if(t[0] == t.back()){ if(t[0] == '0'){ cout << 0 << '\n'; } else{ cout << n << '\n'; } return; } vector<int> dwojki; vector<int> jedynki; int ost = -1; for(int i = 0; i < n; i++){ if(s[i] == '1'){ if(ost != i - 1){ if(ost == -1) jedynki.pb(i); else dwojki.pb(i - ost - 1); } ost = i; } } if(ost != n - 1) jedynki.pb(n - ost - 1); jedynki.pb(0); dwojki.pb(0); sort(all(jedynki)); sort(all(dwojki)); int ans = 0; int ind_jed = 0; int ind_dwa = 0; while(true){ int s1 = sz(jedynki) ? jedynki.back() * 2 : 0; int s2 = sz(dwojki) ? score2(dwojki.back()) : 0; if(max(s1, s2) == 0) break; if(s1 > s2){ ans += jedynki.back(); jedynki.pop_back(); } else{ jedynki.push_back(dwojki.back() - 1); dwojki.pop_back(); ans++; } for(int i = ind_dwa; i < sz(dwojki); i++){ dwojki[i] = max(0, dwojki[i] - 2); if(dwojki[i] == 0) ind_dwa++; } for(int i = ind_jed; i < sz(jedynki); i++){ jedynki[i] = max(0, jedynki[i] - 1); if(jedynki[i] == 0) ind_jed++; } } cout << n - ans << '\n'; } int main(){ ios::sync_with_stdio(0); cin.tie(0); int tests = 1; cin >> tests; for(int i = 0; i < tests; i++) solve(); return 0; } |