//Tadeusz Kielak
#include <bits/stdc++.h>
//#define TEST
using namespace std;
#define FAST ios_base::sync_with_stdio(0) ;cin.tie(0);
#define pb push_back
void przekierowanie()
{
#ifdef TEST
freopen( "input.txt", "r", stdin );
freopen( "output.txt", "w", stdout );
#endif
}
void task()
{
long n;
cin >> n;
string ciag;
cin >> ciag;
vector <long> brzegowe;
vector <long> srodkowe;
long i = 0;
if( ciag[ 0 ] == '0')
{
while( i < n && ciag[ i ] == '0' ) i ++;
brzegowe.pb( i );
}
long j = i;
while( i < n )
{
while( ciag[ i ] == '1' ) i ++;
j = i;
if( i < n )
{
while( i < n && ciag[ i ] == '0' ) i ++;
if( i == n )
brzegowe.pb( i - j);
else
srodkowe.pb( i - j);
}
}
long zdrowe = 0;
sort( srodkowe.begin(), srodkowe.end(), [](long a, long b)
{
return b < a;
}) ;
sort( brzegowe.begin(), brzegowe.end(), [](long a, long b)
{
return b < a;
});
auto l_brzegowych = brzegowe.size();
auto l_srodkowych = srodkowe.size();
long brzeg_index = 0;
long srodek_index = 0;
long z_b = 0;
long z_s = 0;
while ( brzeg_index < l_brzegowych || srodek_index < l_srodkowych )
{
long brzeg_wartosc = -1;
long srodek_wartosc = -1;
if( brzeg_index < l_brzegowych ) brzeg_wartosc = brzegowe[ brzeg_index ];
if( srodek_index < l_srodkowych ) srodek_wartosc = srodkowe[ srodek_index ];
if( brzeg_wartosc < 0 || srodek_wartosc - ( (z_b * 2) + ( z_s * 4 ) )> brzeg_wartosc - ( z_b + z_s * 2 ) + 2)
{
srodek_wartosc -= (z_b * 2) + ( z_s * 4 );
if( srodek_wartosc > 1 ) srodek_wartosc -= 1;
if( srodek_wartosc > 0)
{
z_s ++;
zdrowe += srodek_wartosc;
}
srodek_index ++;
}
else
{
brzeg_wartosc -= z_b + z_s * 2;
if( brzeg_wartosc > 0)
{
z_b ++;
zdrowe += brzeg_wartosc;
}
brzeg_index ++;
}
}
cout << n - zdrowe << '\n';
}
int main()
{
FAST
przekierowanie();
long t;
cin >> t;
while( t -- )
task();
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 | //Tadeusz Kielak #include <bits/stdc++.h> //#define TEST using namespace std; #define FAST ios_base::sync_with_stdio(0) ;cin.tie(0); #define pb push_back void przekierowanie() { #ifdef TEST freopen( "input.txt", "r", stdin ); freopen( "output.txt", "w", stdout ); #endif } void task() { long n; cin >> n; string ciag; cin >> ciag; vector <long> brzegowe; vector <long> srodkowe; long i = 0; if( ciag[ 0 ] == '0') { while( i < n && ciag[ i ] == '0' ) i ++; brzegowe.pb( i ); } long j = i; while( i < n ) { while( ciag[ i ] == '1' ) i ++; j = i; if( i < n ) { while( i < n && ciag[ i ] == '0' ) i ++; if( i == n ) brzegowe.pb( i - j); else srodkowe.pb( i - j); } } long zdrowe = 0; sort( srodkowe.begin(), srodkowe.end(), [](long a, long b) { return b < a; }) ; sort( brzegowe.begin(), brzegowe.end(), [](long a, long b) { return b < a; }); auto l_brzegowych = brzegowe.size(); auto l_srodkowych = srodkowe.size(); long brzeg_index = 0; long srodek_index = 0; long z_b = 0; long z_s = 0; while ( brzeg_index < l_brzegowych || srodek_index < l_srodkowych ) { long brzeg_wartosc = -1; long srodek_wartosc = -1; if( brzeg_index < l_brzegowych ) brzeg_wartosc = brzegowe[ brzeg_index ]; if( srodek_index < l_srodkowych ) srodek_wartosc = srodkowe[ srodek_index ]; if( brzeg_wartosc < 0 || srodek_wartosc - ( (z_b * 2) + ( z_s * 4 ) )> brzeg_wartosc - ( z_b + z_s * 2 ) + 2) { srodek_wartosc -= (z_b * 2) + ( z_s * 4 ); if( srodek_wartosc > 1 ) srodek_wartosc -= 1; if( srodek_wartosc > 0) { z_s ++; zdrowe += srodek_wartosc; } srodek_index ++; } else { brzeg_wartosc -= z_b + z_s * 2; if( brzeg_wartosc > 0) { z_b ++; zdrowe += brzeg_wartosc; } brzeg_index ++; } } cout << n - zdrowe << '\n'; } int main() { FAST przekierowanie(); long t; cin >> t; while( t -- ) task(); return 0; } |
English