#include <bits/stdc++.h> using namespace std; #define F first #define S second int lr(int i,int T,int typ){ if(typ == 1) return i > T ? 1 : 0; if(typ == 2){ if(2 * T >= i) return 0; else if(i - 2 * T <= 2) return 1; else return 2; } } int licz(int i,int T){ if(2 * T >= i) return 0; else if(i - 2 * T <= 2) return 1; else return i - 2 * T - 1 ; } void solve(){ int n; string s; cin >> n >> s; int p; p = -1; vector<int> t(n+2, 0); int gr1,gr2; gr1 = gr2 = 0; for(int i=0; i<n; i++){ if(s[i] == '1' && p == -1){ gr1 = i - p - 1; p = i; }else if(s[i] == '1'){ t[i - p - 1]++; p = i; } } if(p == -1){ cout << 0 << "\n"; return ; } gr2 = n - p - 1; int T = 0; int wynik = 0; vector<pair<int,int>> q; for(int i=n; i; i--){ for(int j=0; j<t[i]; j++){ q.push_back({i, T}); wynik += licz(i,T); T += lr(i,T,2); } } if(gr2 > gr1) swap(gr1,gr2); reverse(q.begin(), q.end()); int mw = max(gr1 - T, 0); int mI = -1; int rem = 0; for(int i=0; i<q.size(); i++){ rem += licz(q[i].F,q[i].S) - licz(q[i].F,q[i].S+1); if(mw <= max(gr1 - q[i].S, 0) - rem){ mw = max(gr1 - q[i].S, 0) - rem; mI = i; } } wynik += mw; if(mI != -1){ T = q[mI].S + 1; for(int i=mI; i>=0; i--){ q[i] = {q[i].F, T}; T += lr(q[i].F,T,2); } }else T++; mw = max(gr2 - T, 0); rem = 0; for(int i=0; i<q.size(); i++){ rem += licz(q[i].F,q[i].S) - licz(q[i].F,q[i].S+1); if(mw <= max(gr2 - q[i].S, 0) - rem){ mw = max(gr2 - q[i].S, 0) - rem; } } wynik += mw; cout << n - wynik << "\n"; } int main(){ int Q; cin >> Q; while(Q--) 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <bits/stdc++.h> using namespace std; #define F first #define S second int lr(int i,int T,int typ){ if(typ == 1) return i > T ? 1 : 0; if(typ == 2){ if(2 * T >= i) return 0; else if(i - 2 * T <= 2) return 1; else return 2; } } int licz(int i,int T){ if(2 * T >= i) return 0; else if(i - 2 * T <= 2) return 1; else return i - 2 * T - 1 ; } void solve(){ int n; string s; cin >> n >> s; int p; p = -1; vector<int> t(n+2, 0); int gr1,gr2; gr1 = gr2 = 0; for(int i=0; i<n; i++){ if(s[i] == '1' && p == -1){ gr1 = i - p - 1; p = i; }else if(s[i] == '1'){ t[i - p - 1]++; p = i; } } if(p == -1){ cout << 0 << "\n"; return ; } gr2 = n - p - 1; int T = 0; int wynik = 0; vector<pair<int,int>> q; for(int i=n; i; i--){ for(int j=0; j<t[i]; j++){ q.push_back({i, T}); wynik += licz(i,T); T += lr(i,T,2); } } if(gr2 > gr1) swap(gr1,gr2); reverse(q.begin(), q.end()); int mw = max(gr1 - T, 0); int mI = -1; int rem = 0; for(int i=0; i<q.size(); i++){ rem += licz(q[i].F,q[i].S) - licz(q[i].F,q[i].S+1); if(mw <= max(gr1 - q[i].S, 0) - rem){ mw = max(gr1 - q[i].S, 0) - rem; mI = i; } } wynik += mw; if(mI != -1){ T = q[mI].S + 1; for(int i=mI; i>=0; i--){ q[i] = {q[i].F, T}; T += lr(q[i].F,T,2); } }else T++; mw = max(gr2 - T, 0); rem = 0; for(int i=0; i<q.size(); i++){ rem += licz(q[i].F,q[i].S) - licz(q[i].F,q[i].S+1); if(mw <= max(gr2 - q[i].S, 0) - rem){ mw = max(gr2 - q[i].S, 0) - rem; } } wynik += mw; cout << n - wynik << "\n"; } int main(){ int Q; cin >> Q; while(Q--) solve(); } |