//przyspieszyc
#include <bits/stdc++.h>
#define f first
#define s second
#define add push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pint;
const int N = 1e5+5;
char T[N];
vector< pair< pint , bool > > W;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t,n,len,mx,odp;
pair< pint , bool > pom;
pair< pint , bool > *pom2;
vector<int> jedynki;
cin >> t;
while(t--)
{
odp = 0;
jedynki.clear();
cin >> n;
for(int i=0; i<n; i++)
{
cin >> T[i];
if(T[i]=='1') jedynki.add(i);
}
if(jedynki.empty())
{
cout << 0 << '\n';
continue;
}
for(int i=0; i<jedynki.size()-1; i++)
{
if(jedynki[i]+1 != jedynki[i+1]) W.add({{jedynki[i]+1, jedynki[i+1]-jedynki[i]-1},1});
}
if(jedynki.back()!=n-1) W.add({{jedynki.back()+1, 2*(n-jedynki.back()-1)},0});
if(jedynki[0]!=0) W.add({{0, 2*jedynki[0]},0});
//for(auto i : W) cout << i.f.f << ' ' << i.f.s << '\n';
while(true)
{
mx=0;
for(pair< pint , bool > &i : W)
{
if(i.f.s>mx)
{
mx=i.f.s;
pom=i;
pom2=&i;
}
}
//cout << mx << ' ' << odp << '\n';
if(mx==0){
cout << n-odp << '\n';
break;
}
if(pom.s) //100...001
{
odp+=pom.f.s-1;
for(pair< pint , bool > &i : W)
{
i.f.s-=4;
if(i.s && (i.f.s==1 || i.f.s==2))
{
i.f.s=2; i.s=0;
}
}
}
else //100...00 OR 101
{
odp+=pom.f.s/2;
for(pair< pint , bool > &i : W)
{
i.f.s-=2;
if(i.s && (i.f.s==1 || i.f.s==2))
{
i.f.s=2; i.s=0;
}
}
}
(*pom2).f.s=0;
}
}
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 | //przyspieszyc #include <bits/stdc++.h> #define f first #define s second #define add push_back using namespace std; typedef long long ll; typedef pair<int,int> pint; const int N = 1e5+5; char T[N]; vector< pair< pint , bool > > W; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t,n,len,mx,odp; pair< pint , bool > pom; pair< pint , bool > *pom2; vector<int> jedynki; cin >> t; while(t--) { odp = 0; jedynki.clear(); cin >> n; for(int i=0; i<n; i++) { cin >> T[i]; if(T[i]=='1') jedynki.add(i); } if(jedynki.empty()) { cout << 0 << '\n'; continue; } for(int i=0; i<jedynki.size()-1; i++) { if(jedynki[i]+1 != jedynki[i+1]) W.add({{jedynki[i]+1, jedynki[i+1]-jedynki[i]-1},1}); } if(jedynki.back()!=n-1) W.add({{jedynki.back()+1, 2*(n-jedynki.back()-1)},0}); if(jedynki[0]!=0) W.add({{0, 2*jedynki[0]},0}); //for(auto i : W) cout << i.f.f << ' ' << i.f.s << '\n'; while(true) { mx=0; for(pair< pint , bool > &i : W) { if(i.f.s>mx) { mx=i.f.s; pom=i; pom2=&i; } } //cout << mx << ' ' << odp << '\n'; if(mx==0){ cout << n-odp << '\n'; break; } if(pom.s) //100...001 { odp+=pom.f.s-1; for(pair< pint , bool > &i : W) { i.f.s-=4; if(i.s && (i.f.s==1 || i.f.s==2)) { i.f.s=2; i.s=0; } } } else //100...00 OR 101 { odp+=pom.f.s/2; for(pair< pint , bool > &i : W) { i.f.s-=2; if(i.s && (i.f.s==1 || i.f.s==2)) { i.f.s=2; i.s=0; } } } (*pom2).f.s=0; } } return 0; } |
English