luogu85ptsRE了,但比赛爆零
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll INF = 1e5 + 10;
ll s1[INF], s2[INF], op1[INF], op2[INF];
struct node{
int l, r, cnt1, cnt0;
} A[INF], B[INF];
int main() {
// freopen("P11361_7.in", "r", stdin);
// freopen("edit.out", "w", stdout);
ll wobaozhengzhegebianliangmingyongbudao;
cin >> wobaozhengzhegebianliangmingyongbudao;
int n, t, c1, c0, ans, l, r, sum1, sum2, t1;
string oo;
while (wobaozhengzhegebianliangmingyongbudao--) {
scanf("%d", &n);
c1 = c0 = ans = sum1 = sum2 = 0;
t = l = r = t1 = 0;
cin >> oo;
for (int i = 1; i <= n; i++) {
s1[i] = oo[i - 1] - '0';
}
cin >> oo;
for (int i = 1; i <= n; i++) {
s2[i] = oo[i - 1] - '0';
}
l = 1;
cin >> oo;
op1[0] = 0;
for (int i = 1; i <= n; i++) {
t = oo[i - 1] - '0';
if (t == 0) {
op1[0]++;
op1[op1[0]] = i;
if (i > l) {
sum1++;
A[sum1].l = l;
A[sum1].r = i - 1;
A[sum1].cnt0 = c0;
A[sum1].cnt1 = c1;
}
c0 = 0;
c1 = 0;
l = i + 1;
} else {
if (s1[i] == 1) {
c1++;
} else {
c0++;
}
}
}
if (l != n + 1) {
sum1++;
A[sum1].l = l;
A[sum1].r = n;
A[sum1].cnt0 = c0;
A[sum1].cnt1 = c1;
}
l = 1;
c0 = 0;
c1 = 0;
cin >> oo;
op2[0] = 0;
for (int i = 1; i <= n; i++) {
t = oo[i - 1] - '0';
if (t == 0) {
op2[0]++;
op2[op2[0]] = i;
if (i > l) {
sum2++;
B[sum2].l = l;
B[sum2].r = i - 1;
B[sum2].cnt0 = c0;
B[sum2].cnt1 = c1;
}
c0 = 0;
c1 = 0;
l = i + 1;
} else {
if (s2[i] == 1) {
c1++;
} else {
c0++;
}
}
}
if (l != n + 1) {
sum2++;
B[sum2].l = l;
B[sum2].r = n;
B[sum2].cnt0 = c0;
B[sum2].cnt1 = c1;
}
l = r = 1;
// cout << B[2].cnt0 << endl;
for (int i = 1; i <= op1[0]; i++) {
while (B[l].r < op1[i]) {
l++;
}
while (op2[r] < op1[i]) {
r++;
}
if (r <= op2[0] && op1[i] == op2[r]) {
if (s1[op1[i]] == s2[op2[r]]) {
ans++;
}
} else if (l <= sum2 && B[l].l <= op1[i]) {
if (s1[op1[i]] == 1) {
if (B[l].cnt1 > 0) {
ans++;
B[l].cnt1--;
}
} else {
if (B[l].cnt0 > 0) {
ans++;
B[l].cnt0--;
}
}
}
}
// cout << B[2].cnt0 << endl;
l = r = 1;
for (int i = 1; i <= op2[0]; i++) {
while (A[l].r < op2[i]) {
l++;
}
if (A[l].l <= op2[i] && l <= sum1) {
if (s2[op2[i]] == 1) {
if (A[l].cnt1 > 0) {
ans++;
A[l].cnt1--;
}
} else {
if (A[l].cnt0 > 0) {
ans++;
A[l].cnt0--;
}
}
}
}
int i;
l = 1, i = 1;
while (1) {
while ((A[i].r < B[l].l || B[l].r < A[i].l) && l <= sum2 && i <= sum1) {
if (A[i].r < B[l].l) {
i++;
} else {
l++;
}
}
if (i == sum1 + 1) {
break;
}
if (l == sum2 + 1) {
break;
}
t = min(A[i].r, B[l].r) - max(A[i].l, B[l].l) + 1;
// cout << t << endl;
if (min(A[i].cnt1, B[l].cnt1) < t) {
ans += min(A[i].cnt1, B[l].cnt1);
t1 = A[i].cnt1 - min(A[i].cnt1, B[l].cnt1);
t -= min(A[i].cnt1, B[l].cnt1);
B[l].cnt1 -= min(A[i].cnt1, B[l].cnt1);
A[i].cnt1 = t1;
} else {
// cout << ans << ' ';
A[i].cnt1 -= t;
B[l].cnt1 -= t;
// cout << t << ' ';
ans += t;
// cout << ans << endl;
t = 0;
}
// cout << t << endl;
if (min(A[i].cnt0, B[l].cnt0) < t) {
// cout << '*' << endl;
// cout << A[i].cnt0 << ' ' << B[i].cnt0 << endl;
ans += min(A[i].cnt0, B[l].cnt0);
t1 = A[i].cnt0 - min(A[i].cnt0, B[l].cnt0);
t -= min(A[i].cnt0, B[l].cnt0);
B[l].cnt0 -= min(A[i].cnt0, B[l].cnt0);
A[i].cnt0 = t1;
} else {
// cout << ans << ' ';
A[i].cnt0 -= t;
B[l].cnt0 -= t;
ans += t;
// cout << ans << endl;
t = 0;
}
if (A[i].r > B[l].r) {
l++;
} else {
i++;
}
}
printf("%d\n", ans);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
/*
1
9
101111111
100111000
110111011
011111111
1
6
011101
111010
111010
10110
*/