#include <iostream> #include <stdio.h> #include <set> using namespace std; char tab[100100]; int main() { // your code goes here int t; scanf("%d",&t); while(t--) { // printf("test: %d\n",t); int n; scanf("%d\n",&n); scanf("%s",tab); int p=0,k=n-1; while(tab[p]=='0' && p<n)p++; if(p==n){printf("0\n");continue;}; while(tab[k]=='0' && k>=0)k--; multiset<int> mshalf,ms; if(p>0)mshalf.insert(p); if(k<n-1)mshalf.insert((n-1-k)); int s=0; for(int i=p;i<k;i++) { if(tab[i]=='1' && tab[i+1]=='0')s=0; if(tab[i]=='0' && tab[i+1]=='1')ms.insert(s); s++; } /* for(auto it=mshalf.begin();it!=mshalf.end();it++) printf("%d,",*it); printf("\n"); for(auto it=ms.begin();it!=ms.end();it++) printf("%d,",*it); printf("\n"); */ int r=0; int u=0; while(!ms.empty() || !mshalf.empty()) { auto it1= ms.end(), it2=mshalf.end(); int a=-1, ahalf=-1; if(!ms.empty()) {it1--; a = *it1;} if(!mshalf.empty()) {it2--; ahalf = *it2;} //printf("a:%d ahalf:%d r:%d\n",a,ahalf,r); if(a<=0 && ahalf<=0) break; int d=1; if((a>ahalf+2) || ahalf<=0) { //printf("a\n"); if(a<=0)break; ms.erase(it1); if(a>1)mshalf.insert(a-1); u++; } else { //printf("ahalf\n"); if(ahalf<=0)break; u+=ahalf; mshalf.erase(it2); } multiset<int> tmp; for(auto it=ms.begin();it!=ms.end();it++) if(*it>d*2)tmp.insert(*it -d*2); ms=tmp; tmp.clear(); for(auto it=mshalf.begin();it!=mshalf.end();it++) if(*it>d)tmp.insert(*it -d); mshalf = tmp; } printf("%d\n",n-u); } 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 | #include <iostream> #include <stdio.h> #include <set> using namespace std; char tab[100100]; int main() { // your code goes here int t; scanf("%d",&t); while(t--) { // printf("test: %d\n",t); int n; scanf("%d\n",&n); scanf("%s",tab); int p=0,k=n-1; while(tab[p]=='0' && p<n)p++; if(p==n){printf("0\n");continue;}; while(tab[k]=='0' && k>=0)k--; multiset<int> mshalf,ms; if(p>0)mshalf.insert(p); if(k<n-1)mshalf.insert((n-1-k)); int s=0; for(int i=p;i<k;i++) { if(tab[i]=='1' && tab[i+1]=='0')s=0; if(tab[i]=='0' && tab[i+1]=='1')ms.insert(s); s++; } /* for(auto it=mshalf.begin();it!=mshalf.end();it++) printf("%d,",*it); printf("\n"); for(auto it=ms.begin();it!=ms.end();it++) printf("%d,",*it); printf("\n"); */ int r=0; int u=0; while(!ms.empty() || !mshalf.empty()) { auto it1= ms.end(), it2=mshalf.end(); int a=-1, ahalf=-1; if(!ms.empty()) {it1--; a = *it1;} if(!mshalf.empty()) {it2--; ahalf = *it2;} //printf("a:%d ahalf:%d r:%d\n",a,ahalf,r); if(a<=0 && ahalf<=0) break; int d=1; if((a>ahalf+2) || ahalf<=0) { //printf("a\n"); if(a<=0)break; ms.erase(it1); if(a>1)mshalf.insert(a-1); u++; } else { //printf("ahalf\n"); if(ahalf<=0)break; u+=ahalf; mshalf.erase(it2); } multiset<int> tmp; for(auto it=ms.begin();it!=ms.end();it++) if(*it>d*2)tmp.insert(*it -d*2); ms=tmp; tmp.clear(); for(auto it=mshalf.begin();it!=mshalf.end();it++) if(*it>d)tmp.insert(*it -d); mshalf = tmp; } printf("%d\n",n-u); } return 0; } |