#include <iostream>
#include <vector>
#include <algorithm>
#define lli long long int
using namespace std;
int a, b, c, d, e, l, k, p, w, n, m, q, pop;
vector <int> wiel;
vector <int> skraj, wej;
char z;
int main()
{
scanf("%d", &q);
for (int S = 0; S != q; ++S)
{
scanf("%d\n", &n);
wej.clear();
for (a = 0; a != n; ++a)
{
scanf("%c", &z);
if (z == '1')
{
wej.push_back(a);
}
}
if (wej.empty())
{
printf("0\n");
continue;
}
skraj.clear();
if (wej.front())
{
skraj.push_back(wej.front());
}
if (wej.back() < n - 1)
{
skraj.push_back(n - wej.back() - 1);
if (skraj.front() > skraj.back())
{
swap(skraj.front(), skraj.back());
}
}
wiel.clear();
// a-poczatek przedzialu
for (a = 1; a < wej.size() - 1; ++a)
{
if (wej[a] + 1 != wej[a + 1])
{
wiel.push_back(wej[a + 1] - wej[a] - 1);
}
}
if (!wiel.empty())
{
sort(wiel.begin(), wiel.end());
}
l = 0; w = 0;
while (1)
{
while (!wiel.empty() && wiel.back() - l * 2 <= 0)
{
wiel.pop_back();
}
while (!skraj.empty() && skraj.back() <= l)
{
skraj.pop_back();
}
if (wiel.empty() && skraj.empty())
{
break;
}
if (wiel.empty())
{
w += skraj.back() - l;
skraj.pop_back();
++l;
continue;
}
p = max(1, wiel.back() - l * 2 - 1);
if (skraj.empty())
{
w += p;
l += 2;
wiel.pop_back();
continue;
}
if (p > skraj.back() - l) // *.* == *..* *...* !=*..* -> -- -
{
w += p;
l += 2;
wiel.pop_back();
continue;
}
w += skraj.back() - l;
++l;
skraj.pop_back();
}
printf("%d\n", n-w);
}
}
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 | #include <iostream> #include <vector> #include <algorithm> #define lli long long int using namespace std; int a, b, c, d, e, l, k, p, w, n, m, q, pop; vector <int> wiel; vector <int> skraj, wej; char z; int main() { scanf("%d", &q); for (int S = 0; S != q; ++S) { scanf("%d\n", &n); wej.clear(); for (a = 0; a != n; ++a) { scanf("%c", &z); if (z == '1') { wej.push_back(a); } } if (wej.empty()) { printf("0\n"); continue; } skraj.clear(); if (wej.front()) { skraj.push_back(wej.front()); } if (wej.back() < n - 1) { skraj.push_back(n - wej.back() - 1); if (skraj.front() > skraj.back()) { swap(skraj.front(), skraj.back()); } } wiel.clear(); // a-poczatek przedzialu for (a = 1; a < wej.size() - 1; ++a) { if (wej[a] + 1 != wej[a + 1]) { wiel.push_back(wej[a + 1] - wej[a] - 1); } } if (!wiel.empty()) { sort(wiel.begin(), wiel.end()); } l = 0; w = 0; while (1) { while (!wiel.empty() && wiel.back() - l * 2 <= 0) { wiel.pop_back(); } while (!skraj.empty() && skraj.back() <= l) { skraj.pop_back(); } if (wiel.empty() && skraj.empty()) { break; } if (wiel.empty()) { w += skraj.back() - l; skraj.pop_back(); ++l; continue; } p = max(1, wiel.back() - l * 2 - 1); if (skraj.empty()) { w += p; l += 2; wiel.pop_back(); continue; } if (p > skraj.back() - l) // *.* == *..* *...* !=*..* -> -- - { w += p; l += 2; wiel.pop_back(); continue; } w += skraj.back() - l; ++l; skraj.pop_back(); } printf("%d\n", n-w); } } |
English