#include <iostream>
#include <map>
#include <set>
int main() {
int t, n, len, off;
std::string s;
char *data;
char *pos;
char prev;
long long res;
bool infection;
std::map<int, std::set<char*>, std::greater<int> > dict;
std::cin >> t;
while(t--) {
std::cin >> n >> s;
data = s.data();
prev = ' ';
len = 0;
res = 0;
infection = false;
dict.clear();
while(*data) {
if(*data == '0') {
if(*data != prev) {
pos = data;
len = 1;
} else {
len++;
}
} else {
infection = true;
if(len) {
auto found = dict.find(len);
if(found == dict.end()) {
dict[len] = {};
}
dict[len].insert(pos);
len = 0;
}
}
prev = *data;
data++;
}
if(len) {
auto found = dict.find(len);
if(found == dict.end()) {
dict[len] = {};
}
dict[len].insert(pos);
}
data = s.data();
off = 0;
if(infection) {
for(auto const& el : dict) {
if(off > el.first) {
break;
}
if(el.second.count(data)) {
int xx = el.first-off;
if(xx > 0) {
res += xx;
}
off++;
dict[el.first].erase(data);
}
if(el.second.count(data+s.size()-el.first)) {
int xx = el.first-off;
if(xx > 0) {
res += xx;
}
off++;
dict[el.first].erase(data+s.size()-el.first);
}
for(auto const& x : el.second) {
int xx = el.first-off;
if(xx > 1) {
res += xx-1;
off+=2;
} else if(xx > 0) {
res++;
off++;
}
}
}
res = n-res;
} else {
res = 0;
}
std::cout << res << std::endl;
}
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 | #include <iostream> #include <map> #include <set> int main() { int t, n, len, off; std::string s; char *data; char *pos; char prev; long long res; bool infection; std::map<int, std::set<char*>, std::greater<int> > dict; std::cin >> t; while(t--) { std::cin >> n >> s; data = s.data(); prev = ' '; len = 0; res = 0; infection = false; dict.clear(); while(*data) { if(*data == '0') { if(*data != prev) { pos = data; len = 1; } else { len++; } } else { infection = true; if(len) { auto found = dict.find(len); if(found == dict.end()) { dict[len] = {}; } dict[len].insert(pos); len = 0; } } prev = *data; data++; } if(len) { auto found = dict.find(len); if(found == dict.end()) { dict[len] = {}; } dict[len].insert(pos); } data = s.data(); off = 0; if(infection) { for(auto const& el : dict) { if(off > el.first) { break; } if(el.second.count(data)) { int xx = el.first-off; if(xx > 0) { res += xx; } off++; dict[el.first].erase(data); } if(el.second.count(data+s.size()-el.first)) { int xx = el.first-off; if(xx > 0) { res += xx; } off++; dict[el.first].erase(data+s.size()-el.first); } for(auto const& x : el.second) { int xx = el.first-off; if(xx > 1) { res += xx-1; off+=2; } else if(xx > 0) { res++; off++; } } } res = n-res; } else { res = 0; } std::cout << res << std::endl; } return 0; } |
English