#include <bits/stdc++.h> using namespace std; int main() { cin.tie(0); ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) { int n; cin >> n; string inp; cin >> inp; vector<int> not_virused; int i = 0; while(inp[i] == '0') i++; int left_zeros = (i != 0) ? i : -1, right_zeros = -1, saved = 0; int streak = 0; for(; i < inp.size(); i++) { if(inp[i] == '0') { streak++; } else { not_virused.push_back(streak); streak = 0; } } if(streak) right_zeros = streak; int day = 0; if(right_zeros > left_zeros) swap(left_zeros, right_zeros); not_virused.push_back(0); sort(not_virused.begin(), not_virused.end(), greater<int>()); if(left_zeros != -1 && left_zeros > not_virused[0]) { saved += left_zeros; left_zeros = -1; day++; } if(right_zeros != -1 && right_zeros-1 > not_virused[0]-2) { saved += right_zeros-1; right_zeros = -1; day++; } for(int i = 0; i < not_virused.size(); i++) { int cnt = not_virused[i]; if(cnt - 2*day < 1) { break; } else if(cnt - 2*day == 1 || cnt - 2*day == 2) { saved++; day++; } else if(cnt - 2*day > 2) { saved += cnt - 2*day - 1; day += 2; } } if(left_zeros > day) { saved += left_zeros - day; day++; } if(right_zeros > day) { saved += right_zeros - day; day++; } cout << n-saved << '\n'; } }
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 | #include <bits/stdc++.h> using namespace std; int main() { cin.tie(0); ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) { int n; cin >> n; string inp; cin >> inp; vector<int> not_virused; int i = 0; while(inp[i] == '0') i++; int left_zeros = (i != 0) ? i : -1, right_zeros = -1, saved = 0; int streak = 0; for(; i < inp.size(); i++) { if(inp[i] == '0') { streak++; } else { not_virused.push_back(streak); streak = 0; } } if(streak) right_zeros = streak; int day = 0; if(right_zeros > left_zeros) swap(left_zeros, right_zeros); not_virused.push_back(0); sort(not_virused.begin(), not_virused.end(), greater<int>()); if(left_zeros != -1 && left_zeros > not_virused[0]) { saved += left_zeros; left_zeros = -1; day++; } if(right_zeros != -1 && right_zeros-1 > not_virused[0]-2) { saved += right_zeros-1; right_zeros = -1; day++; } for(int i = 0; i < not_virused.size(); i++) { int cnt = not_virused[i]; if(cnt - 2*day < 1) { break; } else if(cnt - 2*day == 1 || cnt - 2*day == 2) { saved++; day++; } else if(cnt - 2*day > 2) { saved += cnt - 2*day - 1; day += 2; } } if(left_zeros > day) { saved += left_zeros - day; day++; } if(right_zeros > day) { saved += right_zeros - day; day++; } cout << n-saved << '\n'; } } |