#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = 1e5 + 5;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
int n, lic=0;
cin>>n;
string S = ".";
vector<pair<int, pair<int, int>>> kl;
string pom;
cin>>pom;
S+=pom;
bool ok=true;
for(int i=0;i<=n;i++){
if(pom[i]=='1'){
ok=false;
lic++;
}
}
if(ok){
cout<<"0\n";
continue;
}
int cnt=0;
ok = false;
for(int i=1;i<=n;i++){
if(S[i]=='1'){
ok = true;
}
if(ok){
if(S[i]=='0') cnt++;
else if(cnt!=0){
kl.pb({cnt/2+(cnt%2),{-2,cnt}});
cnt=0;
}
}
}
cnt=0;
for(int i=1;i<=n;i++){
if(S[i]=='1') break;
cnt++;
}
if(cnt) kl.pb({cnt,{-1,cnt}});
cnt=0;
for(int i=n;i>=1;i--){
if(S[i]=='1') break;
cnt++;
}
if(cnt) kl.push_back({cnt,{-1,cnt}});
sort(kl.rbegin(), kl.rend());
cnt=0;
for(auto ciag : kl){
if(ciag.first<=cnt){
lic+=ciag.second.second;
continue;
}
lic+=cnt*(ciag.second.first*-1);
if(ciag.second.first==-2){
if(cnt==ciag.first-1){
cnt++;
if(!(ciag.second.second%2)){
lic++;
}
}
else{
cnt+=2;
lic++;
}
continue;
}
cnt++;
}
cout<<lic<<"\n";
}
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 | #include <bits/stdc++.h> #define pb push_back using namespace std; const int N = 1e5 + 5; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--){ int n, lic=0; cin>>n; string S = "."; vector<pair<int, pair<int, int>>> kl; string pom; cin>>pom; S+=pom; bool ok=true; for(int i=0;i<=n;i++){ if(pom[i]=='1'){ ok=false; lic++; } } if(ok){ cout<<"0\n"; continue; } int cnt=0; ok = false; for(int i=1;i<=n;i++){ if(S[i]=='1'){ ok = true; } if(ok){ if(S[i]=='0') cnt++; else if(cnt!=0){ kl.pb({cnt/2+(cnt%2),{-2,cnt}}); cnt=0; } } } cnt=0; for(int i=1;i<=n;i++){ if(S[i]=='1') break; cnt++; } if(cnt) kl.pb({cnt,{-1,cnt}}); cnt=0; for(int i=n;i>=1;i--){ if(S[i]=='1') break; cnt++; } if(cnt) kl.push_back({cnt,{-1,cnt}}); sort(kl.rbegin(), kl.rend()); cnt=0; for(auto ciag : kl){ if(ciag.first<=cnt){ lic+=ciag.second.second; continue; } lic+=cnt*(ciag.second.first*-1); if(ciag.second.first==-2){ if(cnt==ciag.first-1){ cnt++; if(!(ciag.second.second%2)){ lic++; } } else{ cnt+=2; lic++; } continue; } cnt++; } cout<<lic<<"\n"; } return 0; } |
English